home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 23 / Amiga Format AFCD23 (Feb 1998, Issue 107).iso / +look_here_1st!+ / reader_requests / alienbreed3d2 / verynewrender.s < prev    next >
Text File  |  1997-11-28  |  69KB  |  5,052 lines

  1.  
  2. SP EQU 1
  3. SPM EQU 1
  4. BS EQU 1
  5. BP EQU 1
  6. SH EQU 0
  7. PH EQU 1
  8. MB EQU 0
  9. AA EQU 0
  10. DQ EQU 1
  11. DB EQU 1
  12. PDQ EQU 1
  13.  
  14. ScreenWidth EQU 320
  15.  
  16. LARGESCREEN equ 0
  17.  
  18.  
  19. * the 'Hello World' program in 68000 Assembler
  20. * the C version can be found in the Intuition manual
  21.  
  22. * this source code (C) HiSoft 1992 All Rights Reserved
  23.  
  24. * for Devpac Amiga Version 2 the following symbols were changed
  25. * to avoid clashes with the new include files:
  26. * Screen->MyScreen, NewScreen->MyNewScreen
  27. * Window->MyWindow, NewWindow->MyNewWindow
  28.  
  29.     opt    c+,d+
  30.  
  31.     include    workbench:utilities/devpac/system            use pre-assembled header
  32.     include    exec/exec_lib.i
  33.     include    intuition/intuition.i
  34.     include    intuition/intuition_lib.i
  35.     include    graphics/graphics_lib.i
  36.     include    graphics/text.i
  37.  
  38. INTUITION_REV    equ    31        v1.1
  39. GRAPHICS_REV    equ    31        v1.1
  40.  
  41. * Open the intuition library
  42.  
  43.     moveq    #100,d4            default error return code
  44.  
  45.     moveq    #INTUITION_REV,d0    version
  46.     lea    int_name(pc),a1
  47.     CALLEXEC OpenLibrary
  48.     tst.l    d0
  49.     beq    exit_false        if failed then quit
  50.     move.l    d0,_IntuitionBase    else save the pointer
  51.  
  52.     moveq    #GRAPHICS_REV,d0
  53.     lea    graf_name(pc),a1
  54.     CALLEXEC OpenLibrary
  55.     tst.l    d0
  56. ;    beq    exit_closeint        if failed then close Int, exit
  57.     move.l    d0,_GfxBase
  58.     lea    MyNewScreen(pc),a0
  59.     CALLINT    OpenScreen        open a screen
  60.     tst.l    d0
  61. ;    beq    exit_closeall        if failed the close both, exit
  62.     move.l    d0,MyScreen
  63.  
  64.     move.l MyScreen,a0
  65.     lea sc_BitMap(a0),a0
  66.     lea bm_Planes(a0),a0
  67.  
  68.     
  69.     move.l #RAWSCRN,(a0)
  70.     move.l #RAWSCRN+10240,4(a0)
  71.     move.l #RAWSCRN+10240*2,8(a0)
  72.     move.l #RAWSCRN+10240*3,12(a0)
  73.     move.l #RAWSCRN+10240*4,16(a0)
  74.     move.l #RAWSCRN+10240*5,20(a0)
  75.     move.l #RAWSCRN+10240*6,24(a0)
  76.     move.l #RAWSCRN+10240*7,28(a0)
  77.  
  78. * now initialise a NewWindow structure. This is normally easier to
  79. * do with dc.w/dc.l statement etc, but for comparison with the C
  80. * version we do it like this
  81.     lea    MyNewWindow(pc),a0    good place to start
  82.     move.w    #20,nw_LeftEdge(a0)
  83.     move.w    #20,nw_TopEdge(a0)
  84.     move.w    #300,nw_Width(a0)
  85.     move.w    #100,nw_Height(a0)
  86.     move.b    #0,nw_DetailPen(a0)
  87.     move.b    #1,nw_BlockPen(a0)
  88.     move.l    #window_title,nw_Title(a0)
  89. _temp    set    WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING
  90.     move.l    #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0)
  91.     move.l    #CLOSEWINDOW,nw_IDCMPFlags(a0)
  92.     move.w    #CUSTOMSCREEN,nw_Type(a0)
  93.     clr.l    nw_FirstGadget(a0)
  94.     clr.l    nw_CheckMark(a0)
  95.     move.l    MyScreen(pc),nw_Screen(a0)
  96.     clr.l    nw_BitMap(a0)
  97.     move.w    #100,nw_MinWidth(a0)
  98.     move.w    #25,nw_MinHeight(a0)
  99.     move.w    #640,nw_MaxWidth(a0)
  100.     move.w    #200,nw_MaxHeight(a0)
  101.  
  102. * thats it set up, now open the window (a0=NewWindow already)
  103. ;    CALLINT    OpenWindow
  104. ;    tst.l    d0
  105. ;    beq    exit_closescr            if failed
  106. ;    move.l    d0,MyWindow            save it
  107. ;
  108. ;    move.l    d0,a1                window
  109. ;    move.l    wd_RPort(a1),a1            rastport
  110. ;    moveq    #20,d0                X
  111. ;    moveq    #20,d1                Y
  112. ;    CALLGRAF Move                move the cursor
  113. ;
  114. ;    move.l    MyWindow(pc),a0
  115. ;    move.l    wd_RPort(a0),a1            rastport
  116. ;    lea    hello_message(pc),a0
  117. ;    moveq    #11,d0
  118. ;    CALLGRAF Text                print something
  119. ;
  120. ;    move.l    MyWindow(pc),a0
  121. ;    move.l    wd_UserPort(a0),a0
  122. ;    move.b    MP_SIGBIT(a0),d1        (misprint in manual)
  123. ;    moveq    #0,d0
  124. ;    bset    d1,d0                do a shift
  125. ;    CALLEXEC Wait
  126.  
  127. ;    moveq    #0,d4                return code
  128.  
  129. * various exit routines that do tidying up, given a return code in d4
  130.  
  131. ;    move.l    MyWindow(pc),a0
  132. ;    CALLINT CloseWindow
  133.  
  134. ;exit_closescr
  135. ;    move.l    MyScreen(pc),a0
  136. ;    CALLINT CloseScreen
  137.  
  138. ;exit_closeall
  139. ;    move.l    _GfxBase(pc),a1
  140. ;    CALLEXEC CloseLibrary
  141.  
  142. ;exit_closeint
  143. ;    move.l    _IntuitionBase(pc),a1
  144. ;    CALLEXEC CloseLibrary
  145.  
  146. ;done:
  147. ;    bra done
  148.  
  149. SPECULAR EQU SP
  150. SPECMAP EQU SPM
  151. BUMPSPEC EQU BS
  152. BUMPPHONG EQU BP
  153. SHADOWMAP EQU SH
  154. SHADING EQU PH
  155. MOTIONBLUR EQU MB
  156. ANTIALIAS EQU AA
  157. DEPTHQUEUE EQU DQ
  158. DEPTHBALL EQU DB
  159. POLYGONDEPTH EQU PDQ
  160.  
  161.  
  162.  move.l #PALETTEBIT,a0
  163.  move.l #COPIEDPAL+4,a1
  164.  move.w #255,d0
  165.  
  166. copydown:
  167.  move.b 1(a0),(a1)
  168.  move.b 3(a0),4(a1)
  169.  move.b 5(a0),8(a1)
  170.  add.w #6,a0
  171.  add.w #12,a1
  172.  dbra d0,copydown
  173.  
  174.  move.w #256,COPIEDPAL
  175.  move.w #0,COPIEDPAL+2
  176. LOOKFORME:
  177.  move.l MyScreen,a0
  178.  lea sc_ViewPort(a0),a0
  179.  move.l #COPIEDPAL,a1
  180.  move.l _GfxBase,a6
  181.  jsr -$372(a6)
  182.  
  183.  move.l MyScreen,a4
  184.  move.w sc_MouseX(a4),d0
  185.  move.w sc_MouseY(a4),d1
  186.  move.w d0,OLDXM
  187.  move.w d1,OLDYM
  188.     
  189.  move.l 4.w,a6
  190.  move.l #doslibname,a1
  191.  moveq #0,d0
  192.  jsr -552(a6)
  193.  move.l d0,doslib
  194.  
  195.  move.l doslib,a6
  196.  move.l #OBJNAME,d1
  197.  move.l #1005,d2
  198.  jsr -30(a6)
  199.  move.l d0,ROTATEDPTS
  200.  
  201.  move.l doslib,a6
  202.  move.l d0,d1
  203.  move.l #POLYGONDATA,d2
  204.  move.l #30000,d3
  205.  jsr -42(a6)
  206.  
  207.  move.l doslib,a6
  208.  move.l ROTATEDPTS,d1
  209.  jsr -36(a6)
  210.  
  211. loop:
  212.  
  213.  move.w #0,temp
  214.  
  215.  move.l #POLYGONDATA,a3
  216.  move.w (a3)+,SORTIT
  217.  move.l a3,START_OF_OBJECT
  218.     
  219.  move.w (a3)+,num_points
  220.  move.w (a3)+,d6
  221.  move.w d6,num_frames
  222.  move.l a3,POINTER_TO_POINTERS
  223.  lea (a3,d6.w*4),a3
  224.  move.l a3,LinesPtr
  225.  moveq #0,d5
  226.  moveq #0,d2
  227.  
  228.  move.l POINTER_TO_POINTERS,a4
  229.  move.w (a4,d5.w*4),d2
  230.  add.l START_OF_OBJECT,d2
  231.  move.l d2,PtsPtr
  232.  move.w 2(a4,d5.w*4),d5
  233.  add.l START_OF_OBJECT,d5
  234.  move.l d5,PolyAngPtr
  235.  move.l d2,a3
  236.  move.w num_points,d5
  237.  
  238.  move.l (a3)+,OBJONOFF
  239.  
  240.  move.l a3,PointAngPtr
  241.  add.w d5,d5
  242.  move.w d5,d2
  243.  add.w d5,d5
  244.  add.w d5,d2
  245.  add.w d2,a3
  246.  move.l a3,PtsPtr
  247.  
  248.  move.l MyScreen,a4
  249.  move.w sc_MouseX(a4),d0
  250.  move.w sc_MouseY(a4),d1
  251.  
  252.  sub.w OLDXM,d0
  253.  sub.w OLDYM,d1
  254.  add.w d0,OLDXM
  255.  add.w d1,OLDYM
  256.  
  257.  btst #6,$bfe001
  258.  beq.s .SHIFTABOUT
  259.  
  260.  muls #8190,d0
  261.  divs #320,d0
  262.  add.w d0,YANG
  263.  and.w #8190,YANG
  264.  muls #8190,d1
  265.  divs #320,d1
  266.  and.w #8190,d1
  267.  add.w d1,XANG
  268.  and.w #8190,XANG
  269.  
  270. ; add.w #40,AANG
  271. ; add.w #70,BANG
  272. ; and.w #8191,AANG
  273. ; and.w #8191,BANG
  274.  
  275. ; add.w #60,CANG
  276. ; add.w #90,DANG
  277. ; and.w #8191,CANG
  278. ; and.w #8191,DANG
  279.  
  280.  
  281.  bra .ROTABOUT
  282. .SHIFTABOUT
  283.  
  284.   muls #8190,d0
  285.  divs #320,d0
  286.  add.w d0,BANG
  287.  and.w #8190,BANG
  288.  muls #8190,d1
  289.  divs #320,d1
  290.  and.w #8190,d1
  291.  add.w d1,AANG
  292.  and.w #8190,AANG
  293.  
  294.  
  295. .ROTABOUT
  296.  
  297.  move.w AANG,d1
  298.  move.w BANG,d3
  299. ; cmp.w #2,d6
  300. ; bne.s .notsecrot
  301. ; move.w CANG,d1
  302. ; move.w DANG,d3
  303. ;.notsecrot
  304.  move.l #SINETABLE,a1
  305.  move.w (a1,d1.w),XSIN    ;xsin
  306.  move.w (a1,d3.w),YSIN    ;ysin
  307.  
  308.  add.w #2048,a1
  309.  move.w (a1,d1.w),XCOS    ;xcos
  310.  move.w (a1,d3.w),YCOS    ;ycos
  311.  
  312.  move.w XANG,d1
  313.  move.w YANG,d3
  314. ; cmp.w #2,d6
  315. ; bne.s .notsecrot
  316. ; move.w CANG,d1
  317. ; move.w DANG,d3
  318. ;.notsecrot
  319.  move.l #SINETABLE,a1
  320.  move.w (a1,d1.w),XSIN2    ;xsin
  321.  move.w (a1,d3.w),YSIN2    ;ysin
  322.  
  323.  add.w #2048,a1
  324.  move.w (a1,d1.w),XCOS2    ;xcos
  325.  move.w (a1,d3.w),YCOS2    ;ycos
  326.  
  327.  
  328. ************************************************
  329. ************************************************
  330. ************************************************
  331. ************************************************
  332. ************************************************
  333. ************************************************
  334. ************************************************
  335. ************************************************
  336. ************************************************
  337. ************************************************
  338. ************************************************
  339. ************************************************
  340. ************************************************
  341. ************************************************
  342.  
  343. *SHADOW BUFFER CALCULATION
  344.  
  345.  
  346. ; First, calculate the normal brightnesses
  347. ; for points. NB: -1,-1,-1 = this point not used
  348. ; in gouraud shading.
  349.  
  350.  move.l #NORMBRIGHTS,a2
  351.  move.l PointAngPtr,a0
  352.  move.w num_points,d7
  353.  
  354.  move.l #NORMVECTS,a5
  355.  
  356.  subq #1,d7
  357.  
  358. CALCNORMBRIGHTS:
  359.  
  360.  move.w (a0)+,d0
  361.  move.w (a0)+,d1
  362.  move.w (a0)+,d2
  363.  
  364.  move.w #0,d6
  365.  
  366.  cmp.w #-1,d0
  367.  bne.s .notnot
  368.  cmp.w #-1,d1
  369.  bne.s .notnot
  370.  cmp.w #-1,d2
  371.  bne.s .notnot
  372.  
  373.  move.w #-1,x1
  374.  move.w #-1,y1
  375.  move.w #-1,z1
  376.  bra .dontbother
  377.  
  378. .notnot:
  379.  neg.w d1
  380.  
  381.  move.w d0,d3
  382.  move.w d2,d5
  383.  
  384.  muls YCOS,d0
  385.  muls YSIN,d2
  386.  sub.l d2,d0
  387.  add.l d0,d0
  388.  swap d0
  389. ; asr.l #6,d0    ; new x*512
  390.  
  391.  muls YSIN,d3
  392.  muls YCOS,d5
  393.  add.l d5,d3
  394.  add.l d3,d3
  395.  swap d3
  396.  move.w d3,d2    ; new z
  397.  
  398.  move.w d1,d4
  399.  move.w d2,d5
  400.  muls XCOS,d1
  401.  muls XSIN,d2
  402.  sub.l d2,d1
  403.  add.l d1,d1
  404.  swap d1
  405.  
  406.  muls XSIN,d4
  407.  muls XCOS,d5
  408.  add.l d5,d4
  409.  add.l d4,d4
  410.  swap d4
  411.  move.w d4,d2    ; new z
  412.  
  413.  
  414.  move.w d0,d3
  415.  move.w d2,d5
  416.  
  417.  muls YCOS2,d0
  418.  muls YSIN2,d2
  419.  sub.l d2,d0
  420.  add.l d0,d0
  421.  swap d0
  422.  
  423.  muls YSIN2,d3
  424.  muls YCOS2,d5
  425.  add.l d5,d3    
  426.  add.l d3,d3
  427.  swap d3
  428.  move.w d3,d2    ; new z
  429.  
  430.  move.w d1,d4
  431.  move.w d2,d5
  432.  muls XCOS2,d1
  433.  muls XSIN2,d2
  434.  sub.l d2,d1
  435.  add.l d1,d1
  436.  swap d1
  437.  
  438.  muls XSIN2,d4
  439.  muls XCOS2,d5
  440.  add.l d5,d4
  441.  add.l d4,d4
  442.  swap d4
  443.  
  444.  move.w d0,x1
  445.  move.w d1,y1
  446.  move.w d4,z1
  447.  
  448.  tst.w y1
  449.  blt.s .okpos
  450.  
  451.  move.w x1,d1    ; 0-1024
  452.  asr.w #4,d1    ; 0-64
  453.  move.w z1,d2    ; 0-1024
  454.  asr.w #4,d2    ; 0-64
  455.  
  456.  muls d1,d1
  457.  muls d2,d2
  458.  add.l d1,d2
  459.  jsr CALCSQROOT
  460.  tst.w d2
  461.  beq.s .okpos
  462.  
  463.  move.w d2,d3    ; 0-64
  464.  neg.w d3
  465.  add.w #127,d3    ; 64-127
  466.  
  467.  move.w z1,d4
  468.  muls d3,d4
  469.  divs d2,d4
  470.  
  471.  move.w x1,d0
  472.  muls d3,d0
  473.  divs d2,d0
  474.  
  475. ; asr.w #1,d4
  476. ; asr.w #1,d0
  477.  
  478. ; neg.w y3
  479.  
  480. .okpos
  481.  
  482.  asr.w #4,d4
  483.  add.w #128,d4
  484.  move.b d4,d6
  485.  lsl.w #8,d6
  486.  asr.w #4,d0
  487.  add.w #128,d0
  488.  move.b d0,d6
  489.  
  490. ; move.w d1,d6    ; new y 
  491. ;
  492. ; asr.w #4,d6
  493. ; add.w #20,d6
  494. ; ble.s .okokok
  495. ; moveq #0,d6
  496. ;.okokok:
  497. ; add.w #$1c,d6
  498. ; cmp.w #1,d6
  499. ; bge.s .okokokok
  500. ; moveq #1,d6
  501. ;.okokokok:
  502.  
  503. ; add.w #64,d6
  504. ; cmp.w #28,d6
  505. ; blt.s .okbig
  506. ; move.w #28,d6
  507. ;.okbig
  508.  
  509. .dontbother:
  510.  move.w x1,(a5)+
  511.  move.w y1,(a5)+
  512.  move.w z1,(a5)+
  513.  move.w d6,(a2)+
  514.  
  515.  dbra d7,CALCNORMBRIGHTS
  516.  
  517.  
  518. ; Next, calculate the point coords for
  519. ; the shadow buffer.
  520.  
  521.  move.l #SHADOWPTS,a2
  522.  move.l PtsPtr,a0
  523.  move.w num_points,d7
  524.  subq #1,d7
  525.  
  526. ROTPTLOPSHAD:
  527.  move.w (a0)+,d0
  528.  move.w d0,d3
  529.  move.w (a0)+,d1
  530.  move.w (a0)+,d2
  531.  move.w d2,d5
  532.  
  533.  muls YCOS,d0
  534.  muls YSIN,d2
  535.  sub.l d2,d0
  536.  add.l d0,d0
  537.  swap d0
  538. ; asr.l #6,d0    ; new x*512
  539.  
  540.  muls YSIN,d3
  541.  muls YCOS,d5
  542.  add.l d5,d3
  543.  add.l d3,d3
  544.  swap d3
  545.  move.w d3,d2    ; new z
  546.  
  547.  move.w d1,d4
  548.  move.w d2,d5
  549.  muls XCOS,d1
  550.  muls XSIN,d2
  551.  sub.l d2,d1
  552.  add.l d1,d1
  553.  swap d1
  554.  
  555.  muls XSIN,d4
  556.  muls XCOS,d5
  557.  add.l d5,d4
  558.  add.l d4,d4
  559.  swap d4
  560.  move.w d4,d2    ; new z
  561.   
  562.  move.w d0,d3
  563.  move.w d2,d5
  564.  
  565.  muls YCOS2,d0
  566.  muls YSIN2,d2
  567.  sub.l d2,d0
  568.  asr.l #6,d0    ; new x*512
  569.  
  570.  muls YSIN2,d3
  571.  muls YCOS2,d5
  572.  add.l d5,d3
  573.  add.l d3,d3
  574.  swap d3
  575.  move.w d3,d2    ; new z
  576.  
  577.  move.w d1,d4
  578.  move.w d2,d5
  579.  muls XCOS2,d1
  580.  muls XSIN2,d2
  581.  sub.l d2,d1
  582.  asr.l #6,d1    ; new y*512
  583.  
  584.  muls XSIN2,d4
  585.  muls XCOS2,d5
  586.  add.l d5,d4
  587.  add.l d4,d4
  588.  swap d4
  589.  move.w d4,d2    ; new z
  590.  
  591.  ext.l d2
  592.  
  593.  move.w XOFF,d5
  594.  ext.l d5
  595.  asl.l #8,d5
  596.  add.l d5,d5
  597.  add.l d5,d0
  598.  
  599.  move.l d0,(a2)+
  600.  move.l d1,(a2)+
  601.  move.w d2,(a2)+
  602.  
  603.  dbra d7,ROTPTLOPSHAD
  604.  
  605.  
  606.  
  607. ***************************************
  608. * Calculate viewer position for specularity..
  609.  
  610.  move.w #0,d0
  611.  move.w #0,d1
  612.  move.w #-1024,d2
  613.  
  614. ; move.w d0,d3
  615. ; move.w d2,d5
  616. ;
  617. ; muls YCOS,d0
  618. ; muls YSIN,d2
  619. ; sub.l d2,d0
  620. ; add.l d0,d0
  621. ; swap d0
  622. ; asr.l #6,d0    ; new x*512
  623. ; muls YSIN,d3
  624. ; muls YCOS,d5
  625. ; add.l d5,d3
  626. ; add.l d3,d3
  627. ; swap d3
  628. ; move.w d3,d2    ; new z
  629. ;
  630. ; move.w d1,d4
  631. ; move.w d2,d5
  632. ; muls XCOS,d1
  633. ; muls XSIN,d2
  634. ; sub.l d2,d1
  635. ; add.l d1,d1
  636. ; swap d1
  637. ; muls XSIN,d4
  638. ; muls XCOS,d5
  639. ; add.l d5,d4
  640. ; add.l d4,d4
  641. ; swap d4
  642. ; move.w d4,d2    ; new z
  643.  
  644.  move.w d0,d3
  645.  move.w d2,d5
  646.  
  647.  muls YCOS2,d0
  648.  muls YSIN2,d2
  649.  sub.l d2,d0
  650.  add.l d0,d0
  651.  swap d0
  652.  
  653.  muls YSIN2,d3
  654.  muls YCOS2,d5
  655.  add.l d5,d3    
  656.  add.l d3,d3
  657.  swap d3
  658.  move.w d3,d2    ; new z
  659.  
  660.  move.w d1,d4
  661.  move.w d2,d5
  662.  muls XCOS2,d1
  663.  muls XSIN2,d2
  664.  sub.l d2,d1
  665.  add.l d1,d1
  666.  swap d1
  667. ; asr.l #6,d1    ; new y*512
  668.  
  669.  muls XSIN2,d4
  670.  muls XCOS2,d5
  671.  add.l d5,d4
  672.  add.l d4,d4
  673.  swap d4
  674.  
  675.  move.w d0,x2b
  676.  move.w d1,y2b
  677.  move.w d4,z2b
  678.  
  679. ; Now the specular highlight efforts....
  680.  
  681.  move.l #SPECBRIGHTS,a2
  682.  move.l #NORMVECTS,a1
  683.  
  684.  move.l #SHADOWPTS,a5
  685.  
  686.  move.w num_points,d7
  687.  subq #1,d7
  688.  
  689. CALCSPECBRIGHTS:
  690.  
  691.  move.w (a1)+,x1
  692.  move.w (a1)+,y1
  693.  move.w (a1)+,z1
  694.  
  695.  move.w x2b,d0
  696.  move.l (a5)+,d1
  697.  asr.l #8,d1
  698.  asr.l #1,d1
  699.  sub.w d1,d0
  700.  move.w d0,x2
  701.  move.w y2b,d0
  702.  move.l (a5)+,d1
  703.  asr.l #8,d1
  704.  asr.l #1,d1
  705.  sub.w d1,d0
  706.  move.w d0,y2
  707.  move.w z2b,d0
  708.  sub.w (a5)+,d0
  709.  move.w d0,z2
  710.  
  711.  move.w #0,d6
  712.  
  713.  cmp.w #-1,x1
  714.  bne.s .notnot
  715.  cmp.w #-1,y1
  716.  bne.s .notnot
  717.  cmp.w #-1,z1
  718.  beq .dontbother
  719. .notnot: 
  720.  
  721.  move.w x2,d2
  722.  muls d2,d2
  723.  move.w y2,d1
  724.  muls d1,d1
  725.  add.l d1,d2
  726.  move.w z2,d1
  727.  muls d1,d1
  728.  add.l d1,d2
  729.  
  730.  jsr CALCSQROOT
  731.  
  732.  move.w d2,l2
  733.  
  734.  move.w y1,d0
  735.  muls z2,d0
  736.  move.w y2,d1
  737.  muls z1,d1
  738.  sub.l d1,d0    ; x4
  739.  
  740.  move.w z1,d1
  741.  muls x2,d1
  742.  move.w z2,d2
  743.  muls x1,d2
  744.  sub.l d2,d1    ; y4
  745.  
  746.  move.w x1,d2
  747.  muls y2,d2
  748.  move.w x2,d3
  749.  muls y1,d3
  750.  sub.l d3,d2    ; z4
  751.  
  752.  asr.l #8,d0
  753.  asr.l #8,d1
  754.  asr.l #8,d2
  755.  asr.l #2,d0
  756.  asr.l #2,d1
  757.  asr.l #2,d2
  758.  
  759.  move.w x1,d3
  760.  muls d1,d3
  761.  move.w y1,d4
  762.  muls d0,d4
  763.  sub.l d4,d3
  764.  asr.l #8,d3
  765.  asr.l #1,d3
  766.  add.w z2,d3
  767.  
  768.  muls #1024,d3
  769.  divs l2,d3
  770.  
  771.  move.w d3,z3
  772.  
  773.  move.w y1,d3
  774.  muls d2,d3
  775.  move.w z1,d4
  776.  muls d1,d4
  777.  sub.l d4,d3
  778.  asr.l #8,d3
  779.  asr.l #1,d3
  780.  add.w x2,d3
  781.  muls #1024,d3
  782.  divs l2,d3
  783.  
  784.  move.w d3,x3
  785.  
  786.  move.w z1,d3
  787.  muls d0,d3
  788.  move.w x1,d4
  789.  muls d2,d4
  790.  sub.l d4,d3
  791.  asr.l #8,d3
  792.  asr.l #1,d3
  793.  add.w y2,d3
  794.  muls #1024,d3
  795.  divs l2,d3
  796.  
  797.  move.w d3,y3
  798.  
  799.  move.w z3,d3
  800.  asr.w #4,d3
  801.  add.w #128,d3
  802.  
  803.  move.b d3,d6
  804.  lsl.w #8,d6
  805.  
  806.  move.w x3,d3
  807.  asr.w #4,d3
  808.  add.w #128,d3
  809.  move.b d3,d6
  810.   
  811.  tst.w y3
  812.  blt.s .okpos
  813.  
  814.  move.w x3,d1
  815.  asr.w #4,d1
  816.  move.w z3,d2
  817.  asr.w #4,d2
  818.  
  819.  muls d1,d1
  820.  muls d2,d2
  821.  add.l d1,d2
  822.  jsr CALCSQROOT
  823.  tst.w d2
  824.  beq.s .okpos
  825.  
  826.  move.w d2,d3
  827.  neg.w d3
  828.  add.w #127,d3
  829.  
  830.  move.w z3,d4
  831.  muls d3,d4
  832.  divs d2,d4
  833.  asr.w #4,d4
  834.  add.w #128,d4
  835.  move.b d4,d6
  836.  lsl.w #8,d6
  837.  
  838.  move.w x3,d4
  839.  muls d3,d4
  840.  divs d2,d4
  841.  asr.w #4,d4
  842.  add.w #128,d4
  843.  move.b d4,d6
  844.  
  845. ; neg.w y3
  846.  
  847. .okpos
  848.   
  849. ; add.w y2,d3
  850. ;
  851. ; move.w d3,d6
  852. ;
  853. ; asr.w #4,d6
  854. ; add.w #30,d6
  855. ; ble.s .okokok
  856. ; moveq #0,d6
  857. ;.okokok:
  858. ; add.w #$1c,d6
  859. ;
  860. ; cmp.w #1,d6
  861. ; bge.s .okokokok
  862. ; moveq #1,d6
  863. ;.okokokok:
  864.  
  865. ; cmp.w #28,d6
  866. ; blt.s .okbig
  867. ; move.w #28,d6
  868. ;.okbig
  869.  
  870. .dontbother:
  871.  move.w d6,(a2)+
  872.  move.w y3,(a2)+
  873.  
  874.  dbra d7,CALCSPECBRIGHTS
  875.  
  876.  
  877.  
  878.  
  879. * NOW THE POINTS FOR ON-SCREENNESS
  880.  
  881.  move.l #ROTATEDPTS,a2
  882.  move.l PtsPtr,a0
  883.  move.w num_points,d7
  884.  subq #1,d7
  885.  
  886. ROTPTLOP:
  887.  
  888.  move.w (a0)+,d0
  889.  move.w d0,d3
  890.  move.w (a0)+,d1
  891.  move.w (a0)+,d2
  892.  move.w d2,d5
  893.  
  894.  
  895.  
  896.  muls YCOS,d0
  897.  muls YSIN,d2
  898.  sub.l d2,d0
  899.  asr.l #6,d0    ; new x*512
  900.  
  901.  muls YSIN,d3
  902.  muls YCOS,d5
  903.  add.l d5,d3
  904.  add.l d3,d3
  905.  swap d3
  906.  move.w d3,d2    ; new z
  907.  
  908.  move.w d1,d4
  909.  move.w d2,d5
  910.  muls XCOS,d1
  911.  muls XSIN,d2
  912.  sub.l d2,d1
  913.  asr.l #6,d1    ; new y*512
  914.  
  915.  muls XSIN,d4
  916.  muls XCOS,d5
  917.  add.l d5,d4
  918.  add.l d4,d4
  919.  swap d4
  920.  move.w d4,d2    ; new z
  921.  
  922.  ext.l d2
  923.  
  924.  move.w XOFF,d5
  925.  ext.l d5
  926.  asl.l #8,d5
  927.  add.l d5,d5
  928.  add.l d5,d0
  929.  
  930.  move.l d0,(a2)+
  931.  move.l d1,(a2)+
  932.  move.w d2,(a2)+
  933.  
  934.  dbra d7,ROTPTLOP
  935.  
  936. ; Now convert the rotated points to the screen:
  937.  
  938.  move.l #ROTATEDPTS,a0
  939.  move.l #ONSCREENPTS,a2
  940.  move.w num_points,d7
  941.  subq #1,d7
  942. CONVERTTOSCREEN:
  943.  move.l (a0)+,d0
  944.  move.l (a0)+,d1
  945.  move.w (a0)+,d2
  946. ; asr.w #1,d2
  947.  
  948.  add.w ZOFF,d2
  949.  ext.l d2
  950.  
  951.  move.l d0,d3
  952.  asr.l #1,d3
  953.  add.l d3,d0 
  954.  move.l d1,d3
  955.  asr.l #1,d3
  956.  add.l d3,d1 
  957.  
  958.  divs d2,d0
  959.  divs d2,d1
  960.  add.w #160*4,d0
  961.  add.w #128*4,d1
  962.  move.w d0,(a2)+
  963.  move.w d1,(a2)+
  964.  dbra d7,CONVERTTOSCREEN
  965.  
  966.  move.w #254,HIGHPOLY
  967.  
  968.  move.l LinesPtr,a1
  969.  move.l #PartBuffer,a0
  970.  move.l a0,a2
  971.  move.w #15,d0
  972. clrpartbuffSHAD:
  973.  move.l #$80000001,(a2)+
  974.  move.l #$80000001,(a2)+
  975.  move.l #$80000001,(a2)+
  976.  move.l #$80000001,(a2)+
  977.  dbra d0,clrpartbuffSHAD
  978.  
  979.  move.l #SHADOWPTS,a2
  980.  move.l OBJONOFF,d5
  981.  
  982.  move.w #0,d4
  983.  tst.w SORTIT
  984.  bne.s PutInPartsSHAD
  985.  
  986.  
  987. putinunsortedSHAD:
  988.  move.w (a1)+,d7
  989.  blt doneallpartsSHAD
  990.  lsr.l #1,d5
  991.  bcs.s .yeson
  992.  addq #2,a1
  993.  bra putinunsortedSHAD
  994. .yeson:
  995.  
  996.  move.w (a1)+,d6
  997.  move.l #0,(a0)+
  998.  move.w d7,(a0)+
  999.  move.w d4,(a0)+
  1000.  addq #1,d4
  1001.  bra putinunsortedSHAD
  1002.  
  1003. PutInPartsSHAD
  1004.  move.w (a1)+,d7
  1005.  blt doneallpartsSHAD
  1006.  
  1007.  lsr.l #1,d5
  1008.  bcs.s .yeson
  1009.  addq #2,a1
  1010.  bra PutInPartsSHAD
  1011. .yeson:
  1012.  
  1013.  move.w (a1)+,d6
  1014.  move.l 4(a2,d6.w),d0
  1015.  add.l #200000,d0
  1016.  
  1017.  move.l #PartBuffer-8,a0
  1018.  
  1019. stillfrontSHAD
  1020.  addq #8,a0
  1021.  cmp.l (a0),d0
  1022.  blt stillfrontSHAD
  1023.  move.l #endparttab-8,a5
  1024. domoreshiftSHAD:
  1025.  move.l -8(a5),(a5)
  1026.  move.l -4(a5),4(a5)
  1027.  subq #8,a5
  1028.  cmp.l a0,a5
  1029.  bgt.s domoreshiftSHAD
  1030.  
  1031.  move.l d0,(a0)
  1032.  move.w d7,4(a0)
  1033.  move.w d4,6(a0)
  1034.  addq #1,d4
  1035.  bra PutInPartsSHAD
  1036.  
  1037. doneallpartsSHAD:
  1038.  
  1039.  move.l #PartBuffer,a0
  1040.  
  1041.  ifne SHADOWMAP
  1042.  
  1043. PartLoopSHAD
  1044.  move.l (a0)+,d7
  1045.  blt nomorepartsSHAD
  1046.  
  1047.  move.l #SAVEHIGHS,a2
  1048.  move.w 2(a0),d0
  1049.  move.w HIGHPOLY,(a2,d0.w*2)
  1050.  
  1051.  moveq #0,d0
  1052.  move.w (a0),d0
  1053.  addq #4,a0
  1054.  add.l START_OF_OBJECT,d0
  1055.  move.l d0,a1
  1056.  
  1057. polylooSHAD:
  1058.  
  1059.  tst.w (a1)
  1060.  blt.s nomorepolysSHAD
  1061.  movem.l a0/a1/d7,-(a7)
  1062.  bsr doaSHADEpoly
  1063.  movem.l (a7)+,a0/a1/d7
  1064.  
  1065.  move.w (a1),d0
  1066.  lea 18(a1,d0.w*4),a1
  1067.  
  1068.  bra.s polylooSHAD
  1069. nomorepolysSHAD:
  1070.  sub.w #1,HIGHPOLY
  1071.  bra PartLoopSHAD
  1072. nomorepartsSHAD:
  1073.  
  1074.  endc
  1075.  
  1076. *******************************************
  1077. * Now the on-screen bit...
  1078. *******************************************
  1079.  
  1080.  move.l LinesPtr,a1
  1081.  move.l #PartBuffer,a0
  1082.  move.l a0,a2
  1083.  move.w #15,d0
  1084. clrpartbuff:
  1085.  move.l #$80000001,(a2)+
  1086.  move.l #$80000001,(a2)+
  1087.  move.l #$80000001,(a2)+
  1088.  move.l #$80000001,(a2)+
  1089.  dbra d0,clrpartbuff
  1090.  
  1091.  move.l #ROTATEDPTS,a2
  1092.  move.l OBJONOFF,d5
  1093.  
  1094.  moveq #0,d4
  1095.  
  1096.  tst.w SORTIT
  1097.  bne.s PutInParts
  1098.  
  1099. putinunsorted:
  1100.  move.w (a1)+,d7
  1101.  blt doneallparts
  1102.  lsr.l #1,d5
  1103.  bcs.s .yeson
  1104.  addq #2,a1
  1105.  bra putinunsorted
  1106. .yeson:
  1107.  
  1108.  move.w (a1)+,d6
  1109.  move.l #0,(a0)+
  1110.  move.w d7,(a0)+
  1111.  move.w d4,(a0)+
  1112.  
  1113.  addq #1,d4
  1114.  bra putinunsorted
  1115.  
  1116. PutInParts
  1117.  move.w (a1)+,d7
  1118.  blt doneallparts
  1119.  
  1120.  lsr.l #1,d5
  1121.  bcs.s .yeson
  1122.  addq #2,a1
  1123.  bra PutInParts
  1124. .yeson:
  1125.  
  1126.  move.w (a1)+,d6
  1127.  move.l (a2,d6.w),d0
  1128.  asr.l #8,d0
  1129.  asr.l #2,d0
  1130.  muls d0,d0
  1131.  move.l 4(a2,d6.w),d2
  1132.  asr.l #8,d2
  1133.  asr.l #2,d2
  1134.  muls d2,d2
  1135.  add.l d2,d0 
  1136.  move.w 8(a2,d6.w),d2
  1137.  add.w #1024,d2
  1138.  muls d2,d2
  1139.  add.l d2,d0
  1140.  
  1141.  move.l #PartBuffer-8,a0
  1142.  
  1143. stillfront
  1144.  addq #8,a0
  1145.  cmp.l (a0),d0
  1146.  blt stillfront
  1147.  move.l #endparttab-8,a5
  1148. domoreshift:
  1149.  move.l -8(a5),(a5)
  1150.  move.l -4(a5),4(a5)
  1151.  subq #8,a5
  1152.  cmp.l a0,a5
  1153.  bgt.s domoreshift
  1154.  
  1155.  move.l d0,(a0)
  1156.  move.w d7,4(a0)
  1157.  move.w d4,6(a0)
  1158.  addq #1,d4
  1159.  bra PutInParts
  1160.  
  1161. doneallparts:
  1162.  
  1163.  move.l #PartBuffer,a0
  1164.  
  1165. PartLoop
  1166.  move.l (a0)+,d7
  1167.  blt nomoreparts
  1168.  
  1169.  move.l #SAVEHIGHS,a2
  1170.  move.w 2(a0),d0
  1171.  move.w (a2,d0.w*2),HIGHPOLY
  1172.  
  1173.  moveq #0,d0
  1174.  move.w (a0),d0
  1175.  addq #4,a0
  1176.  add.l START_OF_OBJECT,d0
  1177.  move.l d0,a1
  1178.  
  1179. polyloo:
  1180.  
  1181.  tst.w (a1)
  1182.  blt.s nomorepolys
  1183.  movem.l a0/a1/d7,-(a7)
  1184.  bsr doapoly
  1185.  movem.l (a7)+,a0/a1/d7
  1186.  
  1187.  move.w (a1),d0
  1188.  lea 18(a1,d0.w*4),a1
  1189.  
  1190.  bra.s polyloo
  1191. nomorepolys:
  1192.  sub.w #1,HIGHPOLY
  1193.  bra PartLoop
  1194. nomoreparts:
  1195.  
  1196. NOPOLYS:
  1197.  
  1198.  
  1199.  
  1200. ********************************************
  1201.  
  1202.  ifne DEPTHBALL
  1203.  
  1204.  
  1205.  move.l #BALLXOFF,a5
  1206.  move.l #BALLXANGPOS,a6
  1207.  
  1208. BALLLOOP
  1209.  
  1210.  move.l FASTBUFFER,a0
  1211.  move.l #BALL,a1
  1212.  move.l #DEPTHBUFFER,a2
  1213.  
  1214.  add.l #320*(128-32),a0
  1215.  add.l #320*4*(128-32),a2
  1216.  
  1217.  add.l #(160-32),a0
  1218.  add.l #(160-32)*4,a2
  1219.  
  1220.  move.w (a5),d0
  1221.  
  1222.  cmp.w #999,d0
  1223.  beq NOMOREBALLS
  1224.  
  1225.  add.w d0,a0
  1226.  lea (a2,d0.w*4),a2
  1227.  
  1228.  move.w 2(a5),d0
  1229.  muls #320,d0
  1230.  add.l d0,a0
  1231.  lea (a2,d0.l*4),a2
  1232.  
  1233.  move.l #$7ffffff,d6
  1234.  
  1235.  move.l #GOURPAL,a3
  1236.  
  1237.  move.w 4(a5),d7
  1238.  
  1239.  move.w #63,d0
  1240. .balldown
  1241.  move.w #63,d1
  1242. .ballacross
  1243.  
  1244.  move.w d7,d4
  1245.  moveq #0,d2
  1246.  move.b (a1)+,d2
  1247.  asl.w #2,d2
  1248.  beq.s .nopixel
  1249.  sub.w d2,d4
  1250.  move.l (a2)+,d3
  1251.  swap d3
  1252.  sub.w d4,d3
  1253.  ble.s .noplot
  1254.  
  1255.  asr.w #1,d3
  1256.  asr.w #1,d2
  1257.  
  1258.  cmp.w d2,d3
  1259.  blt.s .okthick
  1260.  move.w d2,d3
  1261. .okthick:
  1262.  
  1263.  cmp.w #31,d3
  1264.  ble.s .okv
  1265.  move.w #31,d3
  1266. .okv:
  1267.  
  1268.  asl.w #8,d3
  1269.  
  1270.  move.b (a0),d3
  1271.  
  1272.  move.b (a3,d3.w),(a0)
  1273. ; move.b #15,(a0)
  1274.  
  1275. .noplot
  1276.  addq #1,a0
  1277.  dbra d1,.ballacross
  1278.  
  1279.  add.l #(320-64),a0
  1280.  add.l #(320-64)*4,a2
  1281.  
  1282.  dbra d0,.balldown
  1283.  
  1284.  bra DONEBALL
  1285.  
  1286. .nopixel:
  1287.  addq #4,a2
  1288.  addq #1,a0
  1289.  dbra d1,.ballacross
  1290.  
  1291.  add.l #(320-64),a0
  1292.  add.l #(320-64)*4,a2
  1293.  
  1294.  dbra d0,.balldown
  1295.  
  1296.  
  1297. DONEBALL:
  1298.  
  1299.  move.w 2(a6),d0
  1300.  move.l #SINETABLE,a0
  1301.  move.w (a0,d0.w),d1
  1302.  add.w (a6)+,d0
  1303.  and.w #8190,d0
  1304.  move.w d0,(a6)+
  1305.  ext.l d1
  1306.  asl.l #7,d1
  1307.  swap d1
  1308.  move.w d1,(a5)+
  1309.  
  1310.  move.w 2(a6),d0
  1311.  move.l #SINETABLE,a0
  1312.  move.w (a0,d0.w),d1
  1313.  add.w (a6)+,d0
  1314.  and.w #8190,d0
  1315.  move.w d0,(a6)+
  1316.  ext.l d1
  1317.  asl.l #6,d1
  1318.  swap d1
  1319.  move.w d1,(a5)+
  1320.  
  1321.  move.w 2(a6),d0
  1322.  move.l #SINETABLE,a0
  1323.  move.w (a0,d0.w),d1
  1324.  add.w (a6)+,d0
  1325.  and.w #8190,d0
  1326.  move.w d0,(a6)+
  1327.  ext.l d1
  1328.  asl.l #1,d1
  1329.  asl.l #8,d1
  1330.  swap d1
  1331.  move.w d1,(a5)+
  1332.  
  1333.  
  1334.  bra BALLLOOP
  1335.  
  1336. NOMOREBALLS:
  1337.  
  1338.  endc
  1339.  
  1340.  ifne POLYGONDEPTH!DEPTHBALL
  1341.  
  1342.  move.l #DEPTHBUFFER+280*256*4,a0
  1343.  move.l #$7ffffff,d0
  1344.  move.l d0,d1
  1345.  move.l d0,d2
  1346.  move.l d0,d3
  1347.  move.l d0,d4
  1348.  move.l d0,d5
  1349.  move.l d0,d6
  1350.  move.l d0,a1
  1351.  
  1352.  move.w #(320*176)/8,d7
  1353.  
  1354. .clrbuff:
  1355.  movem.l  d0-d6/a1,-(a0)
  1356.  dbra d7,.clrbuff
  1357.  
  1358.  
  1359.  endc
  1360.  
  1361.  
  1362. ********************************************
  1363.  
  1364. ; btst #6,$bfe001
  1365. ; beq.s .SHOWSHADOW
  1366.  
  1367.  ifne MOTIONBLUR
  1368.  
  1369.  move.l FASTBUFFER,d0
  1370.  cmp.l #fasty,d0
  1371.  bne SHOWNSCRN
  1372.  
  1373.  move.l #fasty,a0
  1374.  move.l #fasty2,a1
  1375.  add.l #40*320+64,a0
  1376.  add.l #40*320+64,a1
  1377.  move.l #BLUR,a2
  1378.  move.w #175,d0
  1379.  moveq #0,d6
  1380. .blurchunk:
  1381.  move.w #(192/4)-1,d1
  1382. .blurline:
  1383.  
  1384.  move.l (a0),d2
  1385.  move.l d2,d4
  1386.  swap d4
  1387.  move.l (a1)+,d3
  1388.  move.l d3,d5
  1389.  swap d5
  1390.   
  1391.  lsr.w #8,d5
  1392.  move.b d5,d4
  1393.  move.w d4,d6
  1394.  move.b (a2,d6.l),d7
  1395.  
  1396.  lsl.l #8,d7
  1397.  lsl.l #8,d2
  1398.  lsl.l #8,d3
  1399.  move.l d2,d4
  1400.  move.l d3,d5
  1401.  swap d4
  1402.  swap d5
  1403.  lsr.w #8,d5
  1404.  move.b d5,d4
  1405.  move.w d4,d6
  1406.  move.b (a2,d6.l),d7
  1407.  
  1408.  lsl.l #8,d7
  1409.  lsl.l #8,d2
  1410.  lsl.l #8,d3
  1411.  move.l d2,d4
  1412.  move.l d3,d5
  1413.  swap d4
  1414.  swap d5
  1415.  lsr.l #8,d5
  1416.  move.b d5,d4
  1417.  move.w d4,d6
  1418.  move.b (a2,d6.l),d7
  1419.  
  1420.  lsl.l #8,d7
  1421.  lsl.l #8,d2
  1422.  lsl.l #8,d3
  1423.  move.l d2,d4
  1424.  move.l d3,d5
  1425.  swap d4
  1426.  swap d5
  1427.  lsr.l #8,d5
  1428.  move.b d5,d4
  1429.  move.w d4,d6
  1430.  move.b (a2,d6.l),d7
  1431.  
  1432.  move.l d7,(a0)+
  1433.  
  1434.  dbra d1,.blurline
  1435.  
  1436.  add.w #(320-192),a1
  1437.  add.w #(320-192),a0
  1438.  dbra d0,.blurchunk
  1439.  
  1440.  endc
  1441.  
  1442. FASF:
  1443.  
  1444.  ifne ANTIALIAS
  1445.  
  1446.  
  1447.  move.l #fasty,a0
  1448.  move.l #fasty,a1
  1449.  add.l #40*320+64,a0
  1450.  add.l #41*320+65,a1
  1451.  move.l #BLUR,a2
  1452.  move.w #175,d0
  1453.  moveq #0,d6
  1454. .blurchunk:
  1455.  move.w #(192/4)-1,d1
  1456. .blurline:
  1457.  
  1458.  move.l (a0),d2
  1459.  move.l d2,d4
  1460.  swap d4
  1461.  move.l (a1)+,d3
  1462.  move.l d3,d5
  1463.  swap d5
  1464.   
  1465.  lsr.w #8,d5
  1466.  move.b d5,d4
  1467.  move.w d4,d6
  1468.  move.b (a2,d6.l),d7
  1469.  
  1470.  lsl.l #8,d7
  1471.  lsl.l #8,d2
  1472.  lsl.l #8,d3
  1473.  move.l d2,d4
  1474.  move.l d3,d5
  1475.  swap d4
  1476.  swap d5
  1477.  lsr.w #8,d5
  1478.  move.b d5,d4
  1479.  move.w d4,d6
  1480.  move.b (a2,d6.l),d7
  1481.  
  1482.  lsl.l #8,d7
  1483.  lsl.l #8,d2
  1484.  lsl.l #8,d3
  1485.  move.l d2,d4
  1486.  move.l d3,d5
  1487.  swap d4
  1488.  swap d5
  1489.  lsr.l #8,d5
  1490.  move.b d5,d4
  1491.  move.w d4,d6
  1492.  move.b (a2,d6.l),d7
  1493.  
  1494.  lsl.l #8,d7
  1495.  lsl.l #8,d2
  1496.  lsl.l #8,d3
  1497.  move.l d2,d4
  1498.  move.l d3,d5
  1499.  swap d4
  1500.  swap d5
  1501.  lsr.l #8,d5
  1502.  move.b d5,d4
  1503.  move.w d4,d6
  1504.  move.b (a2,d6.l),d7
  1505.  
  1506.  move.l d7,(a0)+
  1507.  
  1508.  dbra d1,.blurline
  1509.  
  1510.  add.w #(320-192),a1
  1511.  add.w #(320-192),a0
  1512.  dbra d0,.blurchunk
  1513.  
  1514.  endc
  1515.  
  1516.  
  1517.  ifeq LARGESCREEN
  1518.  
  1519.  move.l FASTBUFFER,a0 
  1520.  add.l #40*320+64,a0
  1521.  move.l #RAWSCRN,a1
  1522.  add.l #40*40+8,a1
  1523.  move.l #(24)-1,d0
  1524.  move.l #175,d1
  1525.  move.w #128,d2
  1526.  move.w #16,d3
  1527.  moveq #0,d4
  1528.  moveq #0,d5
  1529.  jsr CHUNKYTOPLANAR 
  1530.  
  1531.  endc
  1532.  
  1533.  ifne LARGESCREEN
  1534.  
  1535.  move.l FASTBUFFER,a0 
  1536.  move.l #RAWSCRN,a1
  1537.  move.l #39,d0
  1538.  move.l #255,d1
  1539.  move.w #0,d2
  1540.  move.w #0,d3
  1541.  moveq #0,d4
  1542.  moveq #0,d5
  1543.  jsr CHUNKYTOPLANAR 
  1544.  
  1545.  endc
  1546.  
  1547.  
  1548.  bra SHOWNSCRN
  1549.  
  1550. .SHOWSHADOW
  1551.  
  1552.  move.l #SHADOWBUFFER,a0
  1553.  add.l #40*256,a0
  1554.  move.l #RAWSCRN,a1
  1555.  add.l #40*40,a1
  1556.  move.l #(256/8)-1,d0
  1557.  move.l #175,d1
  1558.  move.w #0,d2
  1559.  move.w #8,d3
  1560.  moveq #0,d4
  1561.  moveq #0,d5
  1562.  jsr CHUNKYTOPLANAR 
  1563.  
  1564. SHOWNSCRN:
  1565.  
  1566.  ifne MOTIONBLUR
  1567.  
  1568.  move.l #fasty2,d1
  1569.  move.l FASTBUFFER,d0
  1570.  cmp.l #fasty,d0
  1571.  beq.s .ok2
  1572.  move.l #fasty,d1
  1573. .ok2:
  1574.  move.l d1,FASTBUFFER 
  1575.  
  1576.  endc
  1577.  
  1578.  move.l FASTBUFFER,a0
  1579.  move.l #NEBBIE,a1
  1580.  ifeq LARGESCREEN
  1581.  add.l #40*320+64,a0
  1582.  endc
  1583.  
  1584.  move.l #BLUR,a2
  1585.  ifeq LARGESCREEN
  1586.  moveq #0,d6
  1587.  move.w #175,d0
  1588.  endc
  1589.  ifne LARGESCREEN
  1590.  move.l #$e5e5e5e5,d6
  1591.  move.w #511,d0
  1592.  endc
  1593.  
  1594. clrchunk:
  1595.  
  1596.  ifeq LARGESCREEN
  1597.  REPT 192/4
  1598.  move.l (a1)+,(a0)+
  1599.  endr
  1600.  add.w #(320-192),a0
  1601.  endc
  1602.  
  1603.  ifne LARGESCREEN
  1604.  REPT 160/4
  1605.  move.l d6,(a0)+
  1606.  endr
  1607.  endc
  1608.  
  1609.  dbra d0,clrchunk
  1610.  
  1611.  move.l #SHADOWBUFFER,a0
  1612.  move.l #-1,d1
  1613.  move.l #-1,d2
  1614.  move.w #15,d0
  1615. ;clrshad:
  1616. ; move.w #15,d5
  1617. ;innner
  1618. ; move.l d2,(a0)+
  1619. ; move.l d2,(a0)+
  1620. ; move.l d2,(a0)+
  1621. ; move.l d2,(a0)+
  1622. ; move.l d1,(a0)+
  1623. ; move.l d1,(a0)+
  1624. ; move.l d1,(a0)+
  1625. ; move.l d1,(a0)+
  1626. ; move.l d2,(a0)+
  1627. ; move.l d2,(a0)+
  1628. ; move.l d2,(a0)+
  1629. ; move.l d2,(a0)+
  1630. ; move.l d1,(a0)+
  1631. ; move.l d1,(a0)+
  1632. ; move.l d1,(a0)+
  1633. ; move.l d1,(a0)+
  1634. ; move.l d2,(a0)+
  1635. ; move.l d2,(a0)+
  1636. ; move.l d2,(a0)+
  1637. ; move.l d2,(a0)+
  1638. ; move.l d1,(a0)+
  1639. ; move.l d1,(a0)+
  1640. ; move.l d1,(a0)+
  1641. ; move.l d1,(a0)+
  1642. ; move.l d2,(a0)+
  1643. ; move.l d2,(a0)+
  1644. ; move.l d2,(a0)+
  1645. ; move.l d2,(a0)+
  1646. ; move.l d1,(a0)+
  1647. ; move.l d1,(a0)+
  1648. ; move.l d1,(a0)+
  1649. ; move.l d1,(a0)+
  1650. ; move.l d2,(a0)+
  1651. ; move.l d2,(a0)+
  1652. ; move.l d2,(a0)+
  1653. ; move.l d2,(a0)+
  1654. ; move.l d1,(a0)+
  1655. ; move.l d1,(a0)+
  1656. ; move.l d1,(a0)+
  1657. ; move.l d1,(a0)+
  1658. ; move.l d2,(a0)+
  1659. ; move.l d2,(a0)+
  1660. ; move.l d2,(a0)+
  1661. ; move.l d2,(a0)+
  1662. ; move.l d1,(a0)+
  1663. ; move.l d1,(a0)+
  1664. ; move.l d1,(a0)+
  1665. ; move.l d1,(a0)+
  1666. ; move.l d2,(a0)+
  1667. ; move.l d2,(a0)+
  1668. ; move.l d2,(a0)+
  1669. ; move.l d2,(a0)+
  1670. ; move.l d1,(a0)+
  1671. ; move.l d1,(a0)+
  1672. ; move.l d1,(a0)+
  1673. ; move.l d1,(a0)+
  1674. ; move.l d2,(a0)+
  1675. ; move.l d2,(a0)+
  1676. ; move.l d2,(a0)+
  1677. ; move.l d2,(a0)+
  1678. ; move.l d1,(a0)+
  1679. ; move.l d1,(a0)+
  1680. ; move.l d1,(a0)+
  1681. ; move.l d1,(a0)+
  1682. ; dbra d5,innner
  1683. ; exg d1,d2
  1684. ;
  1685. ; dbra d0,clrshad
  1686.  
  1687.  
  1688.  
  1689.     btst #7,$bfe001
  1690.     beq.s exit_closescr
  1691.  
  1692.  
  1693.     add.l #$8000,lmxoff
  1694.     cmp.l #40*65536,lmxoff
  1695.     blt.s .oksm
  1696.     sub.l #40*65536,lmxoff    
  1697. .oksm
  1698.  
  1699.     bra loop
  1700.     
  1701. lmxoff: dc.l 0
  1702.  
  1703. exit_closescr
  1704.     move.l    MyScreen(pc),a0
  1705.     CALLINT CloseScreen
  1706.  
  1707. exit_closeall
  1708.     move.l    _GfxBase(pc),a1
  1709.     CALLEXEC CloseLibrary
  1710.  
  1711. exit_closeint
  1712.     move.l    _IntuitionBase(pc),a1
  1713.     CALLEXEC CloseLibrary
  1714.  
  1715. exit_false
  1716.     move.l    #0,d0                return code
  1717.     rts
  1718.  
  1719. TESTTAB: ds.w 30
  1720.  
  1721. ************************************************
  1722. * SUBROUTINES HERE. ****************************
  1723. ************************************************
  1724.  
  1725.  
  1726. **********************************************************
  1727.  
  1728. * the definition of the screen - note that in assembler you
  1729. * MUST get the sizes of these fields correct, by consulting either
  1730. * the RKM or the header files
  1731.  
  1732.  
  1733. MyNewScreen    dc.w    0,0        left, top
  1734.         dc.w    320,256        width, height
  1735.         dc.w    8        depth
  1736.         dc.b    0,1        pens
  1737.         dc.w    0        viewmodes
  1738.         dc.w    CUSTOMSCREEN    type
  1739.         dc.l    MyFont        font
  1740.         dc.l    screen_title    title
  1741.         dc.l    0        gadgets
  1742.         dc.l    0        bitmap
  1743.  
  1744. * my font definition
  1745. MyFont    dc.l    font_name
  1746.     dc.w    TOPAZ_SIXTY
  1747.     dc.b    FS_NORMAL
  1748.     dc.b    FPF_ROMFONT
  1749.  
  1750. * the variables
  1751. _IntuitionBase    dc.l    0        Intuition lib pointer
  1752. _GfxBase    dc.l    0        graphics lib pointer
  1753. MyScreen        dc.l    0
  1754. MyWindow        dc.l    0
  1755. MyNewWindow    ds.b    nw_SIZE        a buffer
  1756.  
  1757.  
  1758. * some strings
  1759. int_name    INTNAME
  1760. graf_name    GRAFNAME
  1761. hello_message    dc.b    'Hello World'
  1762.  
  1763. * these are C strings, so have to be null terminated
  1764. screen_title    dc.b    'My Own Screen',0
  1765. font_name    dc.b    'topaz.font',0
  1766. window_title    dc.b    'A Simple Window',0
  1767.  
  1768.  even
  1769.  
  1770.  
  1771. doaSHADEpoly:
  1772.  
  1773.  move.w (a1)+,d7    ; sides to draw
  1774.  addq #2,a1        ; avoid holes
  1775.  
  1776.  move.l #SHADOWPTS,a3
  1777.  
  1778.  move.w (a1),d0
  1779.  move.w 4(a1),d1
  1780.  move.w 8(a1),d2
  1781.  muls #10,d0
  1782.  muls #10,d1
  1783.  muls #10,d2
  1784.  move.w 8(a3,d0.w),d3
  1785.  move.w 8(a3,d1.w),d4
  1786.  move.w 8(a3,d2.w),d5
  1787.  move.l (a3,d0.w),d0
  1788.  move.l (a3,d1.w),d1
  1789.  move.l (a3,d2.w),d2
  1790.  asr.l #8,d0
  1791.  asr.l #8,d1
  1792.  asr.l #8,d2
  1793.  asr.l #1,d0
  1794.  asr.l #1,d1
  1795.  asr.l #1,d2
  1796.  
  1797.  sub.w d1,d0
  1798.  sub.w d1,d2
  1799.  sub.w d4,d3
  1800.  sub.w d4,d5
  1801.  muls d3,d2
  1802.  muls d5,d0
  1803.  sub.l d0,d2
  1804.  bge SHADpolybehind
  1805.  
  1806.  
  1807.  
  1808.  move.w #20000,d4    ; top
  1809.  move.w #-20000,d5    ; bottom
  1810.  move.l #UVCOORDS,a4
  1811.  
  1812. putinlinesSHAD:
  1813.  move.w (a1),d0
  1814.  move.w 4(a1),d1
  1815.  
  1816.  moveq #0,d2
  1817.  move.b 2(a1),d2    ; one end U
  1818.  move.w d2,2(a4,d0.w*4)
  1819.  move.b 3(a1),d2    ; one end V
  1820.  move.w d2,(a4,d0.w*4)
  1821.  move.b 6(a1),d2    ; two end U
  1822.  move.w d2,2(a4,d1.w*4)
  1823.  move.b 7(a1),d2    ; two end V
  1824.  move.w d2,(a4,d1.w*4)
  1825.  
  1826.  move.w d0,d2
  1827.  muls #10,d2
  1828.  move.w 8(a3,d2.w),d2    ; Z
  1829.  
  1830.  cmp.w d2,d4
  1831.  ble.s .oktop
  1832.  move.w d2,d4
  1833. .oktop
  1834.  cmp.w d2,d5
  1835.  bge.s .okbot
  1836.  move.w d2,d5
  1837. .okbot
  1838.  
  1839.  movem.l d4/d5/d7/a1/a3/a4,-(a7)
  1840.  bsr SIMPLESHADLINE
  1841.  movem.l (a7)+,d4/d5/d7/a1/a3/a4
  1842.  addq #4,a1
  1843.  dbra d7,putinlinesSHAD
  1844.  addq #4,a1
  1845.   
  1846.  move.w (a1)+,TEXTUREADD
  1847.  
  1848.  asr.w #2,d4
  1849.  asr.w #2,d5
  1850.  add.w #128,d4
  1851.  add.w #128,d5
  1852.  move.w d4,TOPLINE
  1853.  move.w d5,BOTLINE
  1854.  
  1855. * Now draw the shadow polygon....
  1856.  
  1857.  move.l #SHADOWBUFFER,a2
  1858.  move.l #LEFTUVS,a0
  1859.  move.w TOPLINE,d0
  1860.  move.w BOTLINE,d1
  1861.  sub.w d0,d1
  1862.  asl.w #3,d0
  1863.  add.w d0,a0
  1864.  muls #(512/8),d0
  1865.  add.l d0,a2    ; pointer to screen line.
  1866.  
  1867.  subq #1,d1
  1868.  blt NOPOLYGONSHAD
  1869.  
  1870. DOAHORLINESHAD:
  1871.  swap d1
  1872.  
  1873.  move.w RIGHTUVS-LEFTUVS(a0),d0
  1874.  move.w (a0)+,d7
  1875.  sub.w d7,d0
  1876.  blt NOPOLYGONSHAD
  1877.  
  1878.  move.l a2,-(a7)
  1879.  
  1880. ; asr.w #2,d0
  1881. ; asr.w #2,d7
  1882.  lea (a2,d7.w*2),a2
  1883.  ext.l d0
  1884.  addq #1,d0
  1885.  
  1886.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1887.  move.w (a0)+,d4
  1888.  swap d7
  1889.  clr.w d7
  1890.  swap d4
  1891.  clr.w d4
  1892.  sub.l d4,d7
  1893.  divs.l d0,d7
  1894.  move.l d7,a5
  1895.  
  1896.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1897.  swap d7
  1898.  clr.w d7
  1899.  move.w (a0)+,d5
  1900.  swap d5
  1901.  clr.w d5
  1902.  sub.l d5,d7
  1903.  divs.l d0,d7
  1904.  move.l d7,a6
  1905.  
  1906.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1907.  swap d7
  1908.  clr.w d7
  1909.  move.w (a0)+,d6
  1910.  swap d6
  1911.  clr.w d6
  1912.  sub.l d6,d7
  1913.  divs.l d0,d7
  1914.  move.l d7,a3
  1915.  
  1916.  move.l a0,-(a7)
  1917.  move.l d1,-(a7)
  1918.  move.l #TEXTURES,a0
  1919.  move.w TEXTUREADD,d7
  1920.  bge.s .okaddtes3
  1921.  and.w #$7fff,d7
  1922.  add.l #65536*4,a0
  1923. .okaddtes3:
  1924.  ext.l d7
  1925. ; add.l d7,d7
  1926.  asl.l #8,d7
  1927.  add.l d7,a0
  1928.  move.w #0,d7
  1929.  
  1930.  subq #1,d0
  1931.  
  1932. ; d0=xdist
  1933. ; d4=U  a5=DU
  1934. ; d5=V  a6=DV
  1935. ; d6=Y  a3=DY
  1936.  moveq #0,d1
  1937.  
  1938.  swap d6
  1939.  
  1940. PLOTADOT:
  1941.  
  1942. .across
  1943.  
  1944. ; swap d4
  1945. ; swap d5
  1946. ; move.w d4,d2
  1947. ; lsl.w #8,d2
  1948. ; swap d4
  1949. ; move.b d5,d2
  1950. ; add.l a5,d4
  1951. ; swap d5
  1952. ; add.l a6,d5
  1953.  
  1954.  
  1955. ; swap d6
  1956. ; move.b (a2)+,d1
  1957. ; tst.b 1(a0,d2.w*8)
  1958. ; beq.s .noplottt
  1959.  move.b d6,(a2)
  1960.  addq #2,a2
  1961.  
  1962.  dbra d0,.across
  1963.  bra.s .plaster
  1964.  
  1965. .noplottt:
  1966.  addq #1,a2
  1967.  dbra d0,.across
  1968.  
  1969. .plaster:
  1970.  
  1971.  move.l (a7)+,d1
  1972.  move.l (a7)+,a0
  1973.  move.l (a7)+,a2
  1974.  
  1975. .noline:
  1976.  add.w #512,a2
  1977.  
  1978.  swap d1
  1979.  dbra d1,DOAHORLINESHAD
  1980.  
  1981. NOPOLYGONSHAD:
  1982.  
  1983. SHADpolybehind:
  1984.  rts
  1985.  
  1986.  
  1987. ************************************************
  1988.  
  1989. LU: dc.w 0
  1990. LV: dc.w 0
  1991. RU: dc.w 0
  1992. RV: dc.w 0
  1993.     
  1994. SIMPLESHADLINE:
  1995.  move.l #SHADOWPTS,a1
  1996.  
  1997.  move.l #UVCOORDS,a2
  1998.  move.w (a2,d0.w*4),LU
  1999.  move.w 2(a2,d0.w*4),LV
  2000.  move.w (a2,d1.w*4),RU
  2001.  move.w 2(a2,d1.w*4),RV
  2002.  
  2003.  muls #10,d0
  2004.  muls #10,d1
  2005.  move.w 8(a1,d0.w),d2        ;fz
  2006.  move.w 8(a1,d1.w),d7        ;sz
  2007.  ext.l d2
  2008.  ext.l d7
  2009.  
  2010.  move.l #LEFTUVS,a3
  2011.  asr.l #2,d2
  2012.  asr.l #2,d7
  2013.  cmp.l d2,d7 
  2014.  beq .noline
  2015.  
  2016.  bgt.s .lineonright
  2017. .lineonleft:
  2018.  move.l #RIGHTUVS,a3
  2019.  exg d0,d1
  2020.  exg d2,d7
  2021.  
  2022.  move.l LU,d5
  2023.  move.l RU,LU
  2024.  move.l d5,RU
  2025.  
  2026. .lineonright:
  2027.  
  2028.  sub.w d2,d7
  2029.  add.w #128,d2
  2030.  lea (a3,d2.w*8),a3
  2031.  
  2032.  move.w d7,YDIFF
  2033.  
  2034.  move.l (a1,d0.w),d3        ;fx
  2035.  move.l (a1,d1.w),d7        ;sx
  2036.  
  2037.  asl.l #5,d3
  2038.  asl.l #5,d7
  2039.  
  2040.  sub.l d3,d7
  2041.  divs.l YDIFF-2,d7
  2042.  move.l d7,a0    ; dx
  2043.  
  2044.  move.l #ROTATEDPTS,a1
  2045.  
  2046.  move.w LU,d4
  2047.  move.w LV,d5
  2048.  move.w RU,d6
  2049.  move.w RV,d7
  2050.  
  2051.  sub.w d4,d6
  2052.  sub.w d5,d7
  2053.  swap d4
  2054.  swap d5
  2055.  clr.w d4
  2056.  clr.w d5
  2057.  swap d6
  2058.  swap d7
  2059.  clr.w d6
  2060.  clr.w d7
  2061.  
  2062.  divs.l YDIFF-2,d6
  2063.  divs.l YDIFF-2,d7
  2064.  
  2065.  move.l d6,a4
  2066.  move.l d7,a5
  2067.  
  2068. ; asl.w #4,d0
  2069. ; asl.w #4,d1
  2070.  
  2071.  move.l 4(a1,d0.w),d6
  2072.  move.l 4(a1,d1.w),d7
  2073.  asl.l #5,d6
  2074.  asl.l #5,d7
  2075.  sub.l d6,d7
  2076.  divs.l YDIFF-2,d7
  2077.  exg d7,a6
  2078.  exg d7,d6
  2079.  
  2080.  move.l YDIFF-2,d1
  2081.  subq #1,d1
  2082.  
  2083. ; d3=x a0=dx
  2084. ; d4=u a4=du
  2085. ; d5=v a5=dv
  2086. ; d7=y a6=dy
  2087. ; d1=dz
  2088.  
  2089.  move.w HIGHPOLY,d7
  2090.  
  2091.  add.l #128*65536,d3
  2092. ; add.l #128*65536,d7
  2093.  
  2094. .PUTINLINE:
  2095.  swap d3
  2096.  move.w d3,(a3)+
  2097.  swap d3
  2098.  add.l a0,d3
  2099.  swap d4
  2100.  move.w d4,(a3)+
  2101.  swap d4
  2102.  swap d5
  2103.  add.l a4,d4
  2104.  move.w d5,(a3)+
  2105.  swap d5
  2106.  add.l a5,d5
  2107. ; swap d7
  2108.  move.w d7,(a3)+
  2109. ; swap d7
  2110. ; add.l a6,d7
  2111.  dbra d1,.PUTINLINE
  2112.  
  2113. .noline:
  2114.  rts
  2115.  
  2116. BCOS: dc.w 0
  2117. BSIN: dc.w 0
  2118. ACOS: dc.w 0
  2119. ASIN: dc.w 0
  2120.  
  2121. CCOS: dc.w 0
  2122. CSIN: dc.w 0
  2123. DCOS: dc.w 0
  2124. DSIN: dc.w 0
  2125. ECOS: dc.w 0
  2126. ESIN: dc.w 0
  2127.  
  2128. FSX: dc.w 0
  2129. FSY: dc.w 0
  2130. SSX: dc.w 0
  2131. SSY: dc.w 0
  2132.  
  2133. **************************************************
  2134.  
  2135. doapoly:
  2136.  
  2137.  move.w (a1)+,d7    ; sides to draw
  2138.  addq #2,a1        ; avoid holes
  2139.  move.w 12(a1,d7.w*4),pregour
  2140.  
  2141.  move.l #ONSCREENPTS,a3
  2142.  
  2143.  move.w (a1),d0
  2144.  move.w 4(a1),d1
  2145.  move.w 8(a1),d2
  2146.  move.w 2(a3,d0.w*4),d3
  2147.  move.w 2(a3,d1.w*4),d4
  2148.  move.w 2(a3,d2.w*4),d5
  2149.  move.w (a3,d0.w*4),d0
  2150.  move.w (a3,d1.w*4),d1
  2151.  move.w (a3,d2.w*4),d2
  2152.  
  2153.  sub.w d1,d0
  2154.  sub.w d1,d2
  2155.  sub.w d4,d3
  2156.  sub.w d4,d5
  2157.  muls d3,d2
  2158.  muls d5,d0
  2159.  sub.l d0,d2
  2160.  ble polybehind
  2161.  
  2162. ; Now we must rotate the polygons coordinates in
  2163. ; the specular map so that the texturemap is vertical
  2164. ; relative to the specular map and so that bump-
  2165. ; mapping can take place unerroneously!
  2166.  
  2167. ; movem.l d0-d7/a0-a6,-(a7)
  2168.  
  2169.  move.w #0,BCOS
  2170.  move.w #128*128,ACOS
  2171.  move.w #0,BSIN
  2172.  move.w #0,ASIN
  2173.  
  2174.  moveq #0,d3
  2175.  move.b 2(a1),d3
  2176.  moveq #0,d4
  2177.  move.b 3(a1),d4
  2178.  moveq #0,d5
  2179.  move.b 2+4(a1),d5
  2180.  moveq #0,d6
  2181.  move.b 3+4(a1),d6
  2182.  
  2183.  sub.w d3,d5
  2184.  sub.w d4,d6
  2185.  
  2186.  move.w d5,d1
  2187.  move.w d6,d2
  2188.  muls d1,d1
  2189.  muls d2,d2
  2190.  add.l d1,d2
  2191.  jsr CALCSQROOT
  2192.  tst.w d2
  2193.  beq .NOROT
  2194.  
  2195.  ext.l d5
  2196.  ext.l d6
  2197.  asl.l #7,d5
  2198.  asl.l #7,d6
  2199.  divs d2,d5
  2200.  divs d2,d6
  2201.  move.w d5,ECOS
  2202.  move.w d6,ESIN
  2203.  
  2204.  move.w ECOS,d0
  2205.  asl.w #7,d0
  2206.  move.w d0,ACOS
  2207.  move.w ESIN,d0
  2208.  asl.w #7,d0
  2209.  move.w d0,ASIN
  2210.  
  2211.  move.l #SPECBRIGHTS,a3
  2212.  
  2213.  move.w (a1),d0
  2214.  moveq #0,d5
  2215.  moveq #0,d6
  2216.  move.b (a3,d0.w*4),d5
  2217.  move.b 1(a3,d0.w*4),d6
  2218.  move.w 4(a1),d0
  2219.  moveq #0,d3
  2220.  moveq #0,d4
  2221.  move.b (a3,d0.w*4),d3
  2222.  move.b 1(a3,d0.w*4),d4
  2223.  sub.w d5,d3
  2224.  sub.w d6,d4
  2225.  
  2226.  move.w d3,d1
  2227.  move.w d4,d2
  2228.  muls d1,d1
  2229.  muls d2,d2
  2230.  add.l d1,d2
  2231.  jsr CALCSQROOT
  2232.  tst.w d2
  2233.  beq .NOROT1
  2234.  
  2235.  ext.l d3
  2236.  asl.l #7,d3
  2237.  ext.l d4
  2238.  asl.l #7,d4
  2239.  divs d2,d3
  2240.  divs d2,d4
  2241.  move.w d3,BCOS
  2242.  neg.w d4
  2243.  move.w d4,BSIN
  2244.  
  2245.  move.w ECOS,d4
  2246.  move.w ESIN,d5
  2247.  move.w d4,d2
  2248.  move.w d5,d3
  2249.  muls BCOS,d2
  2250.  muls BSIN,d3
  2251.  sub.l d3,d2
  2252.  muls BSIN,d4
  2253.  muls BCOS,d5
  2254.  add.l d5,d4
  2255.  move.w d2,ACOS
  2256.  move.w d4,ASIN
  2257.  
  2258. .NOROT1
  2259.  
  2260.  move.w #0,DCOS
  2261.  move.w #0,DSIN
  2262.  move.w ECOS,d0
  2263.  asl.w #7,d0
  2264.  move.w d0,CCOS
  2265.  move.w ESIN,d0
  2266.  asl.w #7,d0
  2267.  move.w d0,CSIN
  2268.  
  2269. ; bra .NOROT
  2270.  
  2271. ; First calculate angle B
  2272.  
  2273.  move.l #NORMBRIGHTS,a3
  2274.  
  2275.  movem.l d7/a1,-(a7)
  2276.  
  2277. .findnonzer:
  2278.  
  2279.  move.w (a1),d0
  2280.  moveq #0,d5
  2281.  moveq #0,d6
  2282.  move.b (a3,d0.w*2),d5
  2283.  move.b 1(a3,d0.w*2),d6
  2284.  move.w 4(a1),d0
  2285.  moveq #0,d3
  2286.  moveq #0,d4
  2287.  move.b (a3,d0.w*2),d3
  2288.  move.b 1(a3,d0.w*2),d4
  2289.  sub.w d5,d3
  2290.  sub.w d6,d4
  2291.  bne.s .okok
  2292.  tst.w d3
  2293.  bne.s .okok
  2294.  
  2295.  addq #4,a1
  2296.  
  2297.  dbra d7,.findnonzer
  2298.  
  2299.  movem.l (a7)+,d7/a1
  2300.  bra .NOROT
  2301.  
  2302. .okok:
  2303.  
  2304.  moveq #0,d3
  2305.  move.b 2(a1),d3
  2306.  moveq #0,d4
  2307.  move.b 3(a1),d4
  2308.  moveq #0,d5
  2309.  move.b 2+4(a1),d5
  2310.  moveq #0,d6
  2311.  move.b 3+4(a1),d6
  2312.  
  2313.  sub.w d3,d5
  2314.  sub.w d4,d6
  2315.  
  2316.  move.w d5,d1
  2317.  move.w d6,d2
  2318.  muls d1,d1
  2319.  muls d2,d2
  2320.  add.l d1,d2
  2321.  jsr CALCSQROOT
  2322.  tst.w d2
  2323.  beq .NOROT8
  2324.  
  2325.  ext.l d5
  2326.  ext.l d6
  2327.  asl.l #7,d5
  2328.  asl.l #7,d6
  2329.  divs d2,d5
  2330.  divs d2,d6
  2331.  move.w d5,ECOS
  2332.  neg.w d6
  2333.  move.w d6,ESIN
  2334.  move.w ECOS,d0
  2335.  asl.w #7,d0
  2336.  move.w d0,CCOS
  2337.  move.w ESIN,d0
  2338.  asl.w #7,d0
  2339.  neg.w d0
  2340.  move.w d0,CSIN
  2341.  
  2342. .NOROT8:
  2343.  
  2344.  movem.l (a7)+,d7/a1
  2345.  
  2346.  move.w d3,d1
  2347.  move.w d4,d2
  2348.  muls d1,d1
  2349.  muls d2,d2
  2350.  add.l d1,d2
  2351.  jsr CALCSQROOT
  2352.  tst.w d2
  2353.  beq .NOROT
  2354.  
  2355.  ext.l d3
  2356.  asl.l #7,d3
  2357.  ext.l d4
  2358.  asl.l #7,d4
  2359.  divs d2,d3
  2360.  divs d2,d4
  2361.  move.w d3,DCOS
  2362.  neg.w d4
  2363.  move.w d4,DSIN
  2364.  
  2365.  move.w ECOS,d4
  2366.  move.w ESIN,d5
  2367.  move.w d4,d2
  2368.  move.w d5,d3
  2369.  muls DCOS,d2
  2370.  muls DSIN,d3
  2371.  sub.l d3,d2
  2372.  muls DSIN,d4
  2373.  muls DCOS,d5
  2374.  add.l d5,d4
  2375.  move.w d2,CCOS
  2376.  move.w d4,CSIN
  2377.  
  2378.  
  2379. .NOROT:
  2380.  
  2381. ; movem.l (a7)+,d0-d7/a0-a6
  2382.  
  2383.  move.l #ONSCREENPTS,a3
  2384.  
  2385.  move.w #20000,d4    ; top
  2386.  move.w #-20000,d5    ; bottom
  2387.  move.l #UVCOORDS,a4
  2388.  
  2389.  move.l a1,a0
  2390.  
  2391. putinlines:
  2392.  move.w (a1),d0
  2393.  move.w 4(a1),d1
  2394.  
  2395.  moveq #0,d2
  2396.  move.b 2(a1),d2    ; one end U
  2397.  move.w d2,2(a4,d0.w*4)
  2398.  move.b 3(a1),d2    ; one end V
  2399.  move.w d2,(a4,d0.w*4)
  2400.  move.b 6(a1),d2    ; two end U
  2401.  move.w d2,2(a4,d1.w*4)
  2402.  move.b 7(a1),d2    ; two end V
  2403.  move.w d2,(a4,d1.w*4)
  2404.  
  2405.  move.w 2(a3,d0.w*4),d2    ; Z
  2406.  
  2407.  cmp.w d2,d4
  2408.  ble.s .oktop
  2409.  move.w d2,d4
  2410. .oktop
  2411.  cmp.w d2,d5
  2412.  bge.s .okbot
  2413.  move.w d2,d5
  2414. .okbot
  2415.  
  2416.  movem.l a0/d4/d5/d7/a1/a3/a4,-(a7)
  2417.  jsr SIMPLECALCLINE
  2418.  movem.l (a7)+,a0/d4/d5/d7/a1/a3/a4
  2419.  addq #4,a1
  2420.  dbra d7,putinlines
  2421.  addq #4,a1 
  2422.  
  2423.  move.w (a1)+,TEXTUREADD
  2424.  
  2425.  asr.w #2,d4
  2426.  asr.w #2,d5
  2427. ; add.w #128,d4
  2428. ; add.w #128,d5
  2429.  move.w d4,TOPLINE
  2430.  move.w d5,BOTLINE
  2431.   
  2432.  move.l #SHADOWPTS,a1
  2433.  move.w (a0),d0
  2434.  move.w 4(a0),d1
  2435.  move.w 8(a0),d2
  2436.  
  2437. CHECKVALS:
  2438.  
  2439.  muls #10,d0
  2440.  muls #10,d1
  2441.  muls #10,d2
  2442.  
  2443.  lea (a1,d0.w),a0
  2444.  lea (a1,d2.w),a2
  2445.  lea (a1,d1.w),a1
  2446.  
  2447.  move.l (a0),d3
  2448.  sub.l (a1),d3
  2449.  asr.l #8,d3
  2450.  asr.l #1,d3
  2451.  move.l 4(a0),d4
  2452.  sub.l 4(a1),d4
  2453.  asr.l #8,d4
  2454.  asr.l #1,d4
  2455.  move.w 8(a0),d5
  2456.  sub.w 8(a1),d5
  2457.  
  2458.  move.w d3,d6
  2459.  muls d6,d6
  2460.  move.w d4,d7
  2461.  muls d7,d7
  2462.  add.l d7,d6
  2463.  move.w d5,d7
  2464.  muls d7,d7
  2465.  add.l d7,d6
  2466.  move.l d6,d2
  2467.  jsr CALCSQROOT
  2468.  move.w d2,LEN1
  2469.  
  2470.  move.l (a2),d0
  2471.  sub.l (a1),d0
  2472.  asr.l #8,d0
  2473.  asr.l #1,d0
  2474.  move.l 4(a2),d1
  2475.  sub.l 4(a1),d1
  2476.  asr.l #8,d1
  2477.  asr.l #1,d1
  2478.  move.w 8(a2),d2
  2479.  sub.w 8(a1),d2
  2480.  
  2481.  muls d2,d3
  2482.  muls d0,d5
  2483.  sub.l d3,d5    ; length
  2484.  muls.l #$4c,d5
  2485.  
  2486.  muls d0,d0
  2487.  muls d1,d1
  2488.  muls d2,d2
  2489.  add.l d0,d1
  2490.  add.l d1,d2
  2491.  jsr CALCSQROOT
  2492.  
  2493.  muls LEN1,d2
  2494.  bgt.s .ok
  2495.  moveq #1,d2
  2496. .ok
  2497.  
  2498.  divs.l d2,d5
  2499.  
  2500.  add.l #16,d5
  2501.  
  2502.  tst.l d5
  2503.  ble.s .okbr
  2504.  moveq #0,d5
  2505. .okbr:
  2506.  add.w #$5c,d5
  2507.  bge.s .okbr2
  2508.  moveq #0,d5
  2509. .okbr2:
  2510.  
  2511.  move.w d5,d0
  2512.  
  2513.  asl.w #8,d5
  2514.  move.w d5,BRIGHTNESS+2
  2515.  
  2516.  sub.w #$5c,d0
  2517.  asr.w #1,d0
  2518.  add.w #$5c,d0
  2519.  asl.w #8,d0
  2520.  move.w d0,BRIGHTNESS
  2521.  
  2522.  
  2523. ***********************************************
  2524. * Draw the polygon (shadowed).
  2525.  
  2526.  move.l FASTBUFFER,a2
  2527.  move.l #LEFTUVS,a0
  2528.  move.w TOPLINE,d0
  2529.  move.w BOTLINE,d1
  2530.  sub.w d0,d1
  2531.  move.l #LEFTZS,a3
  2532.  lea (a3,d0.w*2),a3
  2533.  move.l a3,ZSPTR
  2534.  
  2535.  move.w d0,d2
  2536.  muls #20,d2
  2537.  add.l d2,a0
  2538.  muls #320,d0
  2539.  add.l d0,a2    ; pointer to screen line.
  2540.  
  2541.  move.l #DEPTHBUFFER,a3
  2542.  lea (a3,d0.l*4),a3    ; pointer to depth buff line
  2543.  move.l a3,DEPTHPTR
  2544.  
  2545.  subq #1,d1
  2546.  blt NOPOLYGON
  2547.  
  2548.  tst.b Gouraud
  2549.  bne GOURPOLY
  2550.  
  2551. DOAHORLINE:
  2552.  swap d1
  2553.  
  2554.  move.w RIGHTUVS-LEFTUVS(a0),d0
  2555.  move.w (a0)+,d7
  2556.  asr.w #2,d0
  2557.  asr.w #2,d7
  2558.  sub.w d7,d0
  2559.  bge.s .okflibble
  2560.  
  2561.  add.w #14,a0
  2562.  add.w #320,a2
  2563.  swap d1
  2564.  dbra d1,DOAHORLINE
  2565.  bra NOPOLYGON
  2566.  
  2567. .okflibble:
  2568.  
  2569.  move.l a2,-(a7)
  2570.  
  2571.  add.w d7,a2
  2572.  ext.l d0
  2573.  addq #1,d0
  2574.  
  2575.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2576.  move.l (a0)+,d2 
  2577.  sub.l d2,d7
  2578.  divs.l d0,d7
  2579.  move.l d7,a1
  2580.  
  2581.  
  2582.  
  2583.  
  2584.  
  2585.  
  2586.  
  2587.  
  2588.  
  2589.  
  2590.  
  2591.  
  2592.  
  2593.  
  2594.  
  2595.  
  2596.  
  2597.  
  2598.  move.l RIGHTUVS-LEFTUVS(a0),d7 
  2599.  move.l (a0)+,d3 
  2600.  
  2601.  
  2602.  
  2603.  
  2604.  
  2605.  
  2606.  
  2607.  
  2608.  
  2609.  
  2610.  
  2611.  
  2612.  
  2613.  
  2614.  
  2615.  
  2616.  
  2617.  
  2618.  
  2619.  
  2620.  sub.l d3,d7
  2621.  divs.l d0,d7
  2622.  move.l d7,a4
  2623.  
  2624.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2625.  move.w (a0)+,d4
  2626.  swap d7
  2627.  clr.w d7
  2628.  swap d4
  2629.  clr.w d4
  2630.  sub.l d4,d7
  2631.  divs.l d0,d7
  2632.  move.l d7,a5
  2633.  
  2634.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2635.  swap d7
  2636.  clr.w d7
  2637.  move.w (a0)+,d5
  2638.  swap d5
  2639.  clr.w d5
  2640.  sub.l d5,d7
  2641.  divs.l d0,d7
  2642.  move.l d7,a6
  2643.  
  2644.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2645.  swap d7
  2646.  clr.w d7
  2647.  move.w (a0)+,d6
  2648.  swap d6
  2649.  clr.w d6
  2650.  sub.l d6,d7
  2651.  divs.l d0,d7
  2652.  move.l d7,a3
  2653.  
  2654.  move.l a0,-(a7)
  2655.  move.l d1,-(a7)
  2656.  move.l #TEXTURES,a0
  2657.  move.w TEXTUREADD,d7
  2658.  bge.s .okaddtes3
  2659.  and.w #$7fff,d7
  2660.  add.l #65536*4,a0
  2661. .okaddtes3:
  2662.  ext.l d7
  2663. ; add.l d7,d7
  2664.  asl.l #8,d7
  2665.  add.l d7,a0
  2666.  move.w #0,d7
  2667.  
  2668.  move.l BRIGHTNESS,a6
  2669.  
  2670.  move.l a7,SAVESTACK
  2671.  move.l #SHADOWBUFFER,a7
  2672.  
  2673.  subq #1,d0
  2674.  
  2675. ; d0=xdist
  2676. ; d2=U    a1=DU
  2677. ; d3=V  a4=DV
  2678. ; d4=X  a5=DX
  2679. ; d5=Y  a6=DY
  2680. ; d6=Z  a3=DZ
  2681.  move.w HIGHPOLY,d5
  2682.  
  2683.  moveq #0,d1
  2684.  swap d6
  2685.  move.w d6,d1
  2686.  lsl.w #8,d1
  2687.  swap d4
  2688.  move.b d4,d1
  2689.  swap d4
  2690.  swap d6
  2691.  
  2692.  moveq #0,d7
  2693.  move.b (a7,d1.l),d7
  2694.  cmp.w d7,d5
  2695.  ble INTHELIGHT
  2696.  bra.s INTHEDARK
  2697.  
  2698. PENUMBRA:
  2699.  moveq #0,d1
  2700.  swap d6
  2701.  move.w d6,d1
  2702.  lsl.w #8,d1
  2703.  swap d4
  2704.  move.b d4,d1
  2705.  swap d4
  2706.  swap d6
  2707.  add.l a5,d4
  2708.  add.l a3,d6
  2709.  
  2710.      moveq #0,d7
  2711.  move.b (a7,d1.l),d7
  2712.  cmp.w d7,d5
  2713.  ble INTOLIGHT
  2714.  bra.s INTODARK
  2715.  
  2716.  
  2717. INTHEDARK:
  2718.  moveq #0,d1
  2719.  swap d6
  2720.  move.w d6,d1
  2721.  lsl.w #8,d1
  2722.  swap d4
  2723.  move.b d4,d1
  2724.  swap d4
  2725.  swap d6
  2726.  add.l a5,d4
  2727.  add.l a3,d6
  2728.  
  2729.  moveq #0,d7
  2730.  move.b (a7,d1.l),d7
  2731.  cmp.w d7,d5
  2732.  ble.s INTOPENUM
  2733. INTODARK:
  2734.  move.w #$5c00,d7
  2735.  swap d2
  2736.  move.w d2,d1
  2737.  asl.w #8,d1
  2738.  swap d3
  2739.  move.b d3,d1
  2740.  swap d2
  2741.  swap d3
  2742.  add.l a1,d2
  2743.  add.l a4,d3
  2744.  
  2745. ; move.b (a0,d1.w*4),d7
  2746. ; beq.s .noplottt
  2747.  
  2748.  move.b TEXTUREPAL-256(pc,d7.w),(a2)+
  2749.  dbra d0,INTHEDARK
  2750.  bra.s PASTAC 
  2751.  
  2752. .noplottt
  2753.  addq #1,a2
  2754.  dbra d0,INTHEDARK
  2755.  bra.s PASTAC
  2756.  
  2757. INTOPENUM:
  2758.  move.l a6,d7
  2759.  swap d7
  2760.  swap d2
  2761.  move.w d2,d1
  2762.  asl.w #8,d1
  2763.  swap d3
  2764.  move.b d3,d1
  2765.  swap d2
  2766.  swap d3
  2767.  add.l a1,d2
  2768.  add.l a4,d3
  2769.  
  2770. ; move.b (a0,d1.w*4),d7
  2771. ; beq.s .noplottt
  2772.  
  2773.  move.b TEXTUREPAL(pc,d7.w),(a2)+
  2774.  dbra d0,PENUMBRA
  2775.  bra.s PASTAC 
  2776.  
  2777. .noplottt
  2778.  addq #1,a2
  2779.  dbra d0,PENUMBRA
  2780.  bra.s PASTAC
  2781.  
  2782. INTHELIGHT:
  2783.  
  2784.  moveq #0,d1
  2785.  swap d6
  2786.  move.w d6,d1
  2787.  lsl.w #8,d1
  2788.  swap d4
  2789.  move.b d4,d1
  2790.  swap d4
  2791.  swap d6
  2792.  add.l a5,d4
  2793.  add.l a3,d6
  2794.  
  2795.  moveq #0,d7
  2796.  move.b (a7,d1.l),d7
  2797.  cmp.w d7,d5
  2798.  bgt.s INTOPENUM
  2799. INTOLIGHT:
  2800.  move.w a6,d7
  2801.  swap d2
  2802.  move.w d2,d1
  2803.  asl.w #8,d1
  2804.  swap d3
  2805.  move.b d3,d1
  2806.  swap d2
  2807.  swap d3
  2808.  add.l a1,d2
  2809.  add.l a4,d3
  2810.  
  2811. ; move.b (a0,d1.w*4),d7
  2812. ; beq.s .noplottt
  2813.  
  2814.  move.b TEXTUREPAL(pc,d7.w),(a2)+
  2815.  dbra d0,INTHELIGHT
  2816.  bra.s PASTAC 
  2817.  
  2818. .noplottt:
  2819.  addq #1,a2
  2820.  dbra d0,INTHELIGHT
  2821.  
  2822. PASTAC
  2823.  
  2824.  move.l SAVESTACK,a7
  2825.  
  2826.  move.l (a7)+,d1
  2827.  move.l (a7)+,a0
  2828.  move.l (a7)+,a2
  2829.  
  2830. .noline:
  2831.  add.w #320,a2
  2832.  
  2833.  swap d1
  2834.  dbra d1,DOAHORLINE
  2835.  
  2836. NOPOLYGON:
  2837. polybehind:
  2838.  rts
  2839.  
  2840. TEXTUREPAL:
  2841.  
  2842. SAVESTACK: dc.l 0
  2843. HIGHPOLY: dc.w 0
  2844. LEN1: dc.w 0
  2845. BRIGHTNESS: dc.l 0
  2846. TRANSTEXT: dc.w 0
  2847. AANG: dc.w 0
  2848. BANG: dc.w 0
  2849. CANG: dc.w 0
  2850. DANG: dc.w 0
  2851.  
  2852.  include "ab3:print.s"
  2853.  
  2854.  temp: dc.w 0
  2855.  
  2856. DEPTHPTR: dc.l 0
  2857. LEFTX: dc.w 0
  2858. ZSPTR: dc.l 0
  2859.  
  2860. GOURPOLY: 
  2861.  
  2862. DOAHORLINEGOUR:
  2863.  swap d1
  2864.  
  2865.  ifeq SHADING
  2866.  move.w #128,16(a0)
  2867.  move.w #128,16+RIGHTUVS-LEFTUVS(a0)
  2868.  move.w #128,4+RIGHTUVS-LEFTUVS(a0)
  2869.  move.w #128,4(a0)
  2870.  endc
  2871.  
  2872.  move.w RIGHTUVS-LEFTUVS(a0),d0
  2873.  move.w (a0)+,d7
  2874.  asr.w #2,d0
  2875.  
  2876.  
  2877.  asr.w #2,d7
  2878.  move.w d7,LEFTX
  2879.  sub.w d7,d0
  2880.  bge.s .okflibble
  2881.  
  2882.  add.w #18,a0
  2883.  add.w #320,a2
  2884.  add.l #320*4,DEPTHPTR
  2885.  swap d1
  2886.  dbra d1,DOAHORLINEGOUR
  2887.  bra NOPOLYGON
  2888.  
  2889. .okflibble:
  2890.  
  2891.  move.l a2,-(a7)
  2892.  
  2893.  ifne POLYGONDEPTH
  2894.  move.l #LINEBUFFER,a2
  2895.  
  2896.  endc
  2897.  
  2898.  add.w d7,a2
  2899.  ext.l d0
  2900.  addq #1,d0
  2901.  
  2902.  move.b RIGHTUVS-LEFTUVS(a0),d3
  2903.  move.b (a0),d2
  2904.  
  2905.  ext.w d3
  2906.  ext.w d2
  2907.  
  2908.  tst.w d2
  2909.  blt .bothtowards
  2910.  
  2911. ; bgt .firstaway
  2912.  tst.w d3
  2913.  blt .bothtowards
  2914.  bra .bothaway
  2915.  
  2916. .firsttowards:
  2917.  tst.w d3
  2918.  ble .bothtowards
  2919.  
  2920. ; First is towards and second away...
  2921.  
  2922.  move.w d0,d7    ; total length
  2923.  move.w d0,d6
  2924.  neg.w d2
  2925.  add.w d2,d3
  2926.  muls d2,d6
  2927.  divs d3,d6    ; length of first bit
  2928.  sub.w d6,d7    ; length of second bit
  2929.  move.w d6,FIRSTLEN
  2930.  move.w d7,LASTLEN
  2931.  
  2932.  tst.w FIRSTLEN
  2933.  beq .bothaway
  2934.  tst.w LASTLEN
  2935.  beq .bothtowards
  2936.  
  2937.  moveq #0,d2
  2938.  moveq #0,d3
  2939.  moveq #0,d4
  2940.  moveq #0,d5
  2941.  move.b 6(a0),d2
  2942.  move.b 7(a0),d3
  2943.  
  2944.  move.w d2,FIRSTU
  2945.  move.w d3,FIRSTV
  2946.  
  2947.  move.w d2,d4
  2948.  move.w d3,d5
  2949.  sub.w #128,d2
  2950.  sub.w #128,d3
  2951.  muls d2,d2
  2952.  muls d3,d3
  2953.  add.l d3,d2
  2954.  jsr CALCSQROOT
  2955.  
  2956.  tst.w d2
  2957.  beq.s .nochng
  2958.  
  2959.  sub.w #128,d4
  2960.  sub.w #128,d5
  2961.  muls #127,d4
  2962.  muls #127,d5
  2963.  divs d2,d4
  2964.  divs d2,d5
  2965.  add.w #128,d4
  2966.  add.w #128,d5
  2967.  
  2968. .nochng:
  2969.  
  2970.  move.w d4,MIDU
  2971.  move.w d5,MIDV
  2972.  
  2973.  move.b 6+RIGHTUVS-LEFTUVS(a0),d4
  2974.  move.b 7+RIGHTUVS-LEFTUVS(a0),d5
  2975.  move.w d4,SECU
  2976.  move.w d5,SECV
  2977.  
  2978.  move.w d4,d2
  2979.  move.w d5,d3
  2980.  
  2981.  sub.w #128,d2
  2982.  sub.w #128,d3
  2983.  muls d2,d2
  2984.  muls d3,d3
  2985.  add.l d3,d2
  2986.  jsr CALCSQROOT
  2987.  
  2988.  tst.w d2
  2989.  beq.s .nochng2
  2990.  
  2991.  sub.w #128,d4
  2992.  sub.w #128,d5
  2993.  muls #127,d4
  2994.  muls #127,d5
  2995.  divs d2,d4
  2996.  divs d2,d5
  2997.  add.w #128,d4
  2998.  add.w #128,d5
  2999.  
  3000. .nochng2:
  3001.  
  3002.  add.w MIDU,d4
  3003.  add.w MIDV,d5
  3004.  asr.w #1,d4
  3005.  asr.w #1,d5
  3006.  move.w d4,MIDU
  3007.  move.w d5,MIDV 
  3008.  
  3009.  move.l RIGHTUVS-LEFTUVS(a0),d7
  3010.  move.l (a0)+,d2 
  3011.  
  3012.  and.l #$ffffff,d2
  3013.  and.l #$ffffff,d7
  3014.  
  3015.  moveq #0,d3
  3016.  moveq #0,d5
  3017.  move.w d2,d3
  3018. ; bge.s .okp1
  3019. ; moveq #0,d3
  3020. ;.okp1
  3021.  move.w d7,d5
  3022. ; bge.s .okp2
  3023. ; moveq #0,d5
  3024. ;.okp2
  3025.  
  3026.  swap d3
  3027.  swap d5
  3028.  sub.l d3,d5
  3029.  divs.l d0,d5
  3030.  asr.l #8,d5
  3031.  move.w d5,RIGHTBRIGHT
  3032.  asr.l #8,d3
  3033.  move.w d3,LEFTBRIGHT
  3034.  
  3035.  clr.w d2
  3036.  clr.w d7
  3037.  sub.l d2,d7
  3038.  asl.l #8,d2
  3039.  divs.l d0,d7
  3040.  asl.l #8,d7
  3041.  
  3042.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  3043.  move.l (a0)+,d3
  3044.  
  3045.  moveq #0,d4
  3046.  moveq #0,d5
  3047.  
  3048. ; move.w d6,d5
  3049. ; move.w d3,d4
  3050. ; move.b #0,d4
  3051. ; move.b #0,d5
  3052.  
  3053.  move.w FIRSTU,d4
  3054.  move.w MIDU,d5
  3055.  lsl.l #8,d4
  3056.  lsl.l #8,d5
  3057.  
  3058.  sub.l d4,d5
  3059.  divs.l FIRSTLEN-2,d5
  3060.  
  3061.  move.w d4,d2
  3062.  move.w d5,d7
  3063.  move.l d7,a1
  3064.  moveq #0,d4
  3065.  moveq #0,d5
  3066.  
  3067. ; move.b d6,d5
  3068. ; move.b d3,d4
  3069.  
  3070. ; swap d5
  3071. ; swap d4
  3072.  
  3073.  move.w FIRSTV,d4
  3074.  move.w MIDV,d5
  3075.  swap d4
  3076.  swap d5
  3077.  
  3078.  sub.l d4,d5
  3079.  divs.l FIRSTLEN-2,d5
  3080.  
  3081.  move.l d5,a3
  3082.  move.l d4,d5
  3083.   
  3084.  clr.w d3
  3085.  clr.w d6
  3086.  sub.l d3,d6
  3087.  divs.l d0,d6
  3088.  move.l d6,a4
  3089.  
  3090.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3091.  move.w (a0)+,d4
  3092.  swap d7
  3093.  clr.w d7
  3094.  swap d4
  3095.  clr.w d4
  3096.  sub.l d4,d7
  3097.  divs.l d0,d7
  3098.  move.l d7,a5
  3099.  
  3100. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  3101. ; swap d7
  3102. ; clr.w d7
  3103.  move.w (a0)+,d7
  3104. ; swap d5
  3105. ; clr.w d5
  3106. ; sub.l d5,d7
  3107. ; divs.l d0,d7
  3108. ; move.l d7,a6
  3109.  
  3110.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3111.  swap d7
  3112.  clr.w d7
  3113.  move.w (a0)+,d6
  3114.  swap d6
  3115.  clr.w d6
  3116.  sub.l d6,d7
  3117.  divs.l d0,d7
  3118.  
  3119.  lsl.l #8,d6
  3120.  lsl.l #8,d7
  3121.  
  3122.  move.w RIGHTBRIGHT,d7
  3123.  move.l d7,a6
  3124.  
  3125.  
  3126.  move.l a0,-(a7)
  3127.  move.l d1,-(a7)
  3128.  move.l #TEXTURES,a0
  3129.  move.w TEXTUREADD,d7
  3130.  bge.s .okaddtes3
  3131.  and.w #$7fff,d7
  3132.  add.l #65536*4,a0
  3133. .okaddtes3:
  3134.  ext.l d7
  3135. ; add.l d7,d7
  3136.  asl.l #8,d7
  3137.  add.l d7,a0
  3138.  move.w #0,d7
  3139.  
  3140.  move.w LEFTBRIGHT,d6
  3141.  
  3142.  subq #1,d0
  3143.  swap d0
  3144.  move.w HIGHPOLY,d0
  3145.  swap d0
  3146.  
  3147.  
  3148. ; d0=xdist
  3149. ; d2=U    a1=DU
  3150. ; d3=V  a4=DV
  3151. ; d4=X  a5=DX
  3152. ; d5=Y  a6=DY
  3153. ; d6=Z  a3=DZ
  3154.  
  3155. ; d0= polynum : polynum : counter : counter
  3156. ; d1= scratch : scratch : scratch : scratch
  3157. ; d2= u : uacc : sv : svacc
  3158. ; d3= v : v : vacc : vacc
  3159. ; d4= x : x : xacc : xacc
  3160. ; d5= su : su : suacc : suacc
  3161. ; d6= z : zacc : bright : brightacc
  3162. ; d7= scratch : scratch : scratch : scratch
  3163.  
  3164. ; a0= textures
  3165. ; a1= uspeed : uspeed : suspeed : suspeed
  3166. ; a2= screen pointer
  3167. ; a3= svspeed : svspeed : svspeed : svspeed
  3168. ; a4= vspeed : vspeed : vspeed : vspeed
  3169. ; a5= xspeed : xspeed : xspeed : xspeed
  3170. ; a6= zspeed : zspeed :brightspeed : brightspeed
  3171. ; a7= shadowmap pointer
  3172.  
  3173.  
  3174.  move.w FIRSTLEN,d0
  3175.  sub.w #1,d0
  3176.  bsr STARTLINE
  3177.  
  3178.  move.l #0,d5
  3179.  move.w #0,d2
  3180.  move.l #0,a3
  3181.  
  3182.  move.w LASTLEN,d0
  3183.  sub.w #1,d0
  3184.  
  3185.  bsr STARTLINE
  3186.  
  3187.  
  3188.  move.l (a7)+,d1
  3189.  move.l (a7)+,a0
  3190.  move.l (a7)+,a2
  3191.  
  3192.  bra .noline
  3193.  
  3194. .firstaway:
  3195.  tst.w d3
  3196.  bge .bothaway
  3197.  
  3198.  
  3199. ; first is away and second is towards...
  3200.  
  3201. ; this really isn't going to work...
  3202.  
  3203.  move.w d0,d7    ; total length
  3204.  move.w d0,d6
  3205.  neg.w d3
  3206.  add.w d2,d3
  3207.  muls d2,d6
  3208.  divs d3,d6    ; length of first bit
  3209.  sub.w d6,d7    ; length of second bit
  3210.  move.w d6,FIRSTLEN
  3211.  move.w d7,LASTLEN
  3212.  
  3213.  tst.w FIRSTLEN
  3214.  beq .bothaway
  3215.  tst.w LASTLEN
  3216.  beq .bothtowards
  3217.  
  3218.  moveq #0,d2
  3219.  moveq #0,d3
  3220.  moveq #0,d4
  3221.  moveq #0,d5
  3222.  move.b 6(a0),d2
  3223.  move.b 7(a0),d3
  3224.  
  3225.  move.w d2,FIRSTU
  3226.  move.w d3,FIRSTV
  3227.  
  3228.  move.w d2,d4
  3229.  move.w d3,d5
  3230.  sub.w #128,d2
  3231.  sub.w #128,d3
  3232.  muls d2,d2
  3233.  muls d3,d3
  3234.  add.l d3,d2
  3235.  jsr CALCSQROOT
  3236.  
  3237.  tst.w d2
  3238.  beq.s .nochng22
  3239.  
  3240.  sub.w #128,d4
  3241.  sub.w #128,d5
  3242.  muls #127,d4
  3243.  muls #127,d5
  3244.  divs d2,d4
  3245.  divs d2,d5
  3246.  add.w #128,d4
  3247.  add.w #128,d5
  3248.  
  3249. .nochng22:
  3250.  
  3251.  move.w d4,MIDU
  3252.  move.w d5,MIDV
  3253.  
  3254.  moveq #0,d4
  3255.  moveq #0,d5
  3256.  move.b 6+RIGHTUVS-LEFTUVS(a0),d4
  3257.  move.b 7+RIGHTUVS-LEFTUVS(a0),d5
  3258.  move.w d4,SECU
  3259.  move.w d5,SECV
  3260.  
  3261.  move.w d4,d2
  3262.  move.w d5,d3
  3263.  
  3264.  sub.w #128,d2
  3265.  sub.w #128,d3
  3266.  muls d2,d2
  3267.  muls d3,d3
  3268.  add.l d3,d2
  3269.  jsr CALCSQROOT
  3270.  
  3271.  tst.w d2
  3272.  beq.s .nochng222
  3273.  
  3274.  sub.w #128,d4
  3275.  sub.w #128,d5
  3276.  muls #127,d4
  3277.  muls #127,d5
  3278.  divs d2,d4
  3279.  divs d2,d5
  3280.  add.w #128,d4
  3281.  add.w #128,d5
  3282.  
  3283. .nochng222:
  3284.  
  3285.  add.w MIDU,d4
  3286.  add.w MIDV,d5
  3287.  asr.w #1,d4
  3288.  asr.w #1,d5
  3289.  move.w d4,MIDU
  3290.  move.w d5,MIDV
  3291.  
  3292.  
  3293.  move.l RIGHTUVS-LEFTUVS(a0),d7
  3294.  move.l (a0)+,d2 
  3295.  
  3296.  and.l #$ffffff,d2
  3297.  and.l #$ffffff,d7
  3298.  
  3299.  moveq #0,d3
  3300.  moveq #0,d5
  3301.  move.w d2,d3
  3302.  move.w d7,d5
  3303.  swap d3
  3304.  swap d5
  3305.  sub.l d3,d5
  3306.  divs.l d0,d5
  3307.  asr.l #8,d5
  3308.  move.w d5,RIGHTBRIGHT
  3309.  asr.l #8,d3
  3310.  move.w d3,LEFTBRIGHT
  3311.  
  3312.  clr.w d2
  3313.  clr.w d7
  3314.  sub.l d2,d7
  3315.  asl.l #8,d2
  3316.  divs.l d0,d7
  3317.  asl.l #8,d7
  3318.  
  3319.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  3320.  move.l (a0)+,d3
  3321.  
  3322.  moveq #0,d4
  3323.  moveq #0,d5
  3324.  
  3325.  move.w MIDU,d4
  3326.  move.w SECU,d5
  3327.  lsl.w #8,d4
  3328.  lsl.w #8,d5
  3329.  
  3330. ; move.w d6,d5
  3331. ; move.w d3,d4
  3332. ; move.b #0,d4
  3333. ; move.b #0,d5
  3334.  
  3335.  sub.l d4,d5
  3336.  divs.l LASTLEN-2,d5
  3337.  
  3338.  move.w d4,d2
  3339.  move.w d5,d7
  3340.  move.l d7,a1
  3341.  moveq #0,d4
  3342.  moveq #0,d5
  3343.  
  3344.  move.w MIDV,d4
  3345.  move.w SECV,d5
  3346.  
  3347.  swap d5
  3348.  swap d4
  3349.  
  3350.  sub.l d4,d5
  3351.  divs.l LASTLEN-2,d5
  3352.  
  3353.  move.l d5,a3
  3354.  move.l d4,d5
  3355.  
  3356.  clr.w d3
  3357.  clr.w d6
  3358.  sub.l d3,d6
  3359.  divs.l d0,d6
  3360.  move.l d6,a4
  3361.  
  3362.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3363.  move.w (a0)+,d4
  3364.  swap d7
  3365.  clr.w d7
  3366.  swap d4
  3367.  clr.w d4
  3368.  sub.l d4,d7
  3369.  divs.l d0,d7
  3370.  move.l d7,a5
  3371.  
  3372. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  3373. ; swap d7
  3374. ; clr.w d7
  3375.  move.w (a0)+,d7
  3376. ; swap d5
  3377. ; clr.w d5
  3378. ; sub.l d5,d7
  3379. ; divs.l d0,d7
  3380. ; move.l d7,a6
  3381.  
  3382.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3383.  swap d7
  3384.  clr.w d7
  3385.  move.w (a0)+,d6
  3386.  swap d6
  3387.  clr.w d6
  3388.  sub.l d6,d7
  3389.  divs.l d0,d7
  3390.  
  3391.  lsl.l #8,d6
  3392.  lsl.l #8,d7
  3393.  
  3394.  move.w RIGHTBRIGHT,d7
  3395.  move.l d7,a6
  3396.  
  3397.  move.l a0,-(a7)
  3398.  move.l d1,-(a7)
  3399.  move.l #TEXTURES,a0
  3400.  move.w TEXTUREADD,d7
  3401.  bge.s .okaddtes4
  3402.  and.w #$7fff,d7
  3403.  add.l #65536*4,a0
  3404. .okaddtes4:
  3405.  ext.l d7
  3406. ; add.l d7,d7
  3407.  asl.l #8,d7
  3408.  add.l d7,a0
  3409.  move.w #0,d7
  3410.  
  3411.  move.w LEFTBRIGHT,d6
  3412.  
  3413.  
  3414.  subq #1,d0
  3415.  swap d0
  3416.  move.w HIGHPOLY,d0
  3417.  swap d0
  3418.  
  3419.  
  3420. ; d0=xdist
  3421. ; d2=U    a1=DU
  3422. ; d3=V  a4=DV
  3423. ; d4=X  a5=DX
  3424. ; d5=Y  a6=DY
  3425. ; d6=Z  a3=DZ
  3426.  
  3427. ; d0= polynum : polynum : counter : counter
  3428. ; d1= scratch : scratch : scratch : scratch
  3429. ; d2= u : uacc : sv : svacc
  3430. ; d3= v : v : vacc : vacc
  3431. ; d4= x : x : xacc : xacc
  3432. ; d5= su : su : suacc : suacc
  3433. ; d6= z : zacc : bright : brightacc
  3434. ; d7= scratch : scratch : scratch : scratch
  3435.  
  3436. ; a0= textures
  3437. ; a1= uspeed : uspeed : suspeed : suspeed
  3438. ; a2= screen pointer
  3439. ; a3= svspeed : svspeed : svspeed : svspeed
  3440. ; a4= vspeed : vspeed : vspeed : vspeed
  3441. ; a5= xspeed : xspeed : xspeed : xspeed
  3442. ; a6= zspeed : zspeed :brightspeed : brightspeed
  3443. ; a7= shadowmap pointer
  3444.  
  3445.  move.w d2,-(a7)
  3446.  move.l d5,-(a7)
  3447.  move.l a3,-(a7)
  3448.  
  3449.  move.w #0,d2
  3450.  move.l #0,d5
  3451.  move.l #0,a3
  3452.  
  3453.  move.w FIRSTLEN,d0
  3454.  subq #1,d0
  3455.  bsr STARTLINE
  3456.  
  3457.  
  3458.  move.l (a7)+,a3
  3459.  move.l (a7)+,d5
  3460.  move.w (a7)+,d2
  3461.  
  3462.  move.w LASTLEN,d0
  3463.  subq #1,d0
  3464.  
  3465.  bsr STARTLINE
  3466.  
  3467.  
  3468.  move.l (a7)+,d1
  3469.  move.l (a7)+,a0
  3470.  move.l (a7)+,a2
  3471.  
  3472.  bra .noline
  3473.  
  3474.  
  3475. .bothaway:
  3476.  
  3477.  move.w #0,6+RIGHTUVS-LEFTUVS(a0)
  3478.  move.w #0,6(a0)
  3479.  
  3480. .bothtowards:
  3481.  
  3482.  ifne PH
  3483.  tst.w 16+RIGHTUVS-LEFTUVS(a0)
  3484.  blt.s .okone
  3485.  tst.w 16(a0)
  3486.  blt.s .okone
  3487.  
  3488.  move.w #0,2(a0)
  3489.  move.w #0,2+RIGHTUVS-LEFTUVS(a0)
  3490.  move.w #0,14(a0)
  3491.  move.w #0,14+RIGHTUVS-LEFTUVS(a0)
  3492.  
  3493. .okone:
  3494.  endc
  3495.  
  3496.  move.l RIGHTUVS-LEFTUVS(a0),d7
  3497.  move.l (a0)+,d2 
  3498.  
  3499.  and.l #$ffffff,d2
  3500.  and.l #$ffffff,d7
  3501.  
  3502.  moveq #0,d3
  3503.  moveq #0,d5
  3504.  move.w d2,d3
  3505.  move.w d7,d5
  3506.  swap d3
  3507.  swap d5
  3508.  sub.l d3,d5
  3509.  divs.l d0,d5
  3510.  asr.l #8,d5
  3511.  move.w d5,RIGHTBRIGHT
  3512.  asr.l #8,d3
  3513.  move.w d3,LEFTBRIGHT
  3514.  
  3515.  clr.w d2
  3516.  clr.w d7
  3517.  sub.l d2,d7
  3518.  asl.l #8,d2
  3519.  divs.l d0,d7
  3520.  asl.l #8,d7
  3521.  
  3522.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  3523.  move.l (a0)+,d3
  3524.  
  3525.  moveq #0,d4
  3526.  moveq #0,d5
  3527.  
  3528.  move.w d6,d5
  3529.  move.w d3,d4
  3530.  move.b #0,d4
  3531.  move.b #0,d5
  3532.  
  3533.  sub.l d4,d5
  3534.  divs.l d0,d5
  3535.  
  3536.  move.w d4,d2
  3537.  move.w d5,d7
  3538.  move.l d7,a1
  3539.  moveq #0,d4
  3540.  moveq #0,d5
  3541.  
  3542.  move.b d6,d5
  3543.  move.b d3,d4
  3544.  
  3545.  swap d5
  3546.  swap d4
  3547.  
  3548.  sub.l d4,d5
  3549.  divs.l d0,d5
  3550.  
  3551.  move.l d5,a3
  3552.  move.l d4,d5
  3553.  
  3554.   
  3555.  clr.w d3
  3556.  clr.w d6
  3557.  sub.l d3,d6
  3558.  divs.l d0,d6
  3559.  
  3560.  asr.l #8,d3        ; XX XX vpos vacc
  3561.  asr.l #8,d6         ; XX XX vspeed vspeed
  3562.  
  3563. ; move.l d6,a4
  3564.  
  3565.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3566.  move.w (a0)+,d4
  3567.  swap d7
  3568.  clr.w d7
  3569.  swap d4
  3570.  clr.w d4
  3571.  sub.l d4,d7
  3572.  divs.l d0,d7
  3573.  asl.l #8,d4
  3574.  asl.l #8,d7
  3575.  move.w d3,d4
  3576.  move.w d6,d7
  3577.  move.l d7,a5
  3578.  
  3579. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  3580. ; swap d7
  3581. ; clr.w d7
  3582.  move.w (a0)+,d7
  3583. ; swap d5
  3584. ; clr.w d5
  3585. ; sub.l d5,d7
  3586. ; divs.l d0,d7
  3587. ; move.l d7,a6
  3588.  
  3589.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3590.  swap d7
  3591.  clr.w d7
  3592.  move.w (a0)+,d6
  3593.  swap d6
  3594.  clr.w d6
  3595.  sub.l d6,d7
  3596.  divs.l d0,d7
  3597.  
  3598.  lsl.l #8,d6
  3599.  lsl.l #8,d7
  3600.  
  3601.  move.w RIGHTBRIGHT,d7
  3602.  move.l d7,a6
  3603.  
  3604.  moveq #0,d7
  3605.  moveq #0,d3
  3606.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3607.  move.w (a0)+,d3
  3608.  
  3609.  addq #2,a0
  3610.  
  3611.  sub.w d3,d7
  3612.  swap d3
  3613.  swap d7
  3614.  divs.l d0,d7
  3615.  
  3616.  move.l d7,a4
  3617.  
  3618.  
  3619.  move.l a0,-(a7)
  3620.  move.l d1,-(a7)
  3621.  move.l #TEXTURES,a0
  3622.  move.w TEXTUREADD,d7
  3623.  bge.s .okaddtes5
  3624.  and.w #$7fff,d7
  3625.  add.l #65536*4,a0
  3626. .okaddtes5:
  3627.  ext.l d7
  3628.  asl.l #8,d7
  3629.  add.l d7,a0
  3630.  move.w #0,d7
  3631.  
  3632.  move.w LEFTBRIGHT,d6
  3633.  
  3634.  subq #1,d0
  3635.  swap d0
  3636.  move.w HIGHPOLY,d0
  3637.  swap d0
  3638.  
  3639.  
  3640. ; d0=xdist
  3641. ; d2=U    a1=DU
  3642. ; d3=V  a4=DV
  3643. ; d4=X  a5=DX
  3644. ; d5=Y  a6=DY
  3645. ; d6=Z  a3=DZ
  3646.  
  3647. ; d0= polynum : polynum : counter : counter
  3648. ; d1= scratch : scratch : scratch : scratch
  3649. ; d2= u : uacc : sv : svacc
  3650. ; d3= pxpos : pxpos : pxacc : pxacc
  3651. ; d4= x : xacc : v : vacc
  3652. ; d5= su : su : suacc : suacc
  3653. ; d6= z : zacc : pypos : pyacc
  3654. ; d7= scratch : scratch : scratch : scratch
  3655.  
  3656. ; a0= textures
  3657. ; a1= uspeed : uspeed : suspeed : suspeed
  3658. ; a2= screen pointer
  3659. ; a3= svspeed : svspeed : svspeed : svspeed
  3660. ; a4= pxspd : pxspd : pxspd : pxspd
  3661. ; a5= xspeed : xspeed : vspeed : vspeed
  3662. ; a6= zspeed : zspeed : pyspeed : pyspeed
  3663. ; a7= shadowmap pointer
  3664.  
  3665.  move.w d0,-(a7)
  3666. ;
  3667.  bsr STARTLINE
  3668.  
  3669.  move.w (a7)+,d0
  3670.  move.l (a7)+,d1
  3671.  move.l (a7)+,a0
  3672.  move.l (a7)+,a2
  3673.  
  3674.  ifne DEPTHBALL!POLYGONDEPTH
  3675.  
  3676.  move.l a2,a5
  3677.  move.l DEPTHPTR,a3
  3678.  move.l #LINEBUFFER,a6
  3679.  move.w LEFTX,d4
  3680.  add.w d4,a6
  3681.  add.w d4,a5
  3682.  lea (a3,d4.w*4),a3
  3683.  
  3684.  move.l ZSPTR,a4
  3685.  move.w RIGHTZS-LEFTZS(a4),d7
  3686.  move.w (a4)+,d2
  3687.  move.l a4,ZSPTR
  3688.  
  3689.  
  3690.  sub.w d2,d7
  3691.  swap d2
  3692.  swap d7
  3693.  clr.w d2
  3694.  clr.w d7
  3695.  addq #1,d0
  3696.  ext.l d0
  3697.  
  3698.  divs.l d0,d7
  3699.  
  3700.  subq #1,d0
  3701.  
  3702. .dodepth:
  3703.  
  3704.  ifne POLYGONDEPTH
  3705.  
  3706.  move.l (a3)+,d6
  3707.  cmp.l d2,d6
  3708.  blt.s .dontplot
  3709.  
  3710.  move.l d2,-4(a3)
  3711.  move.b (a6),(a5)
  3712.  
  3713. .dontplot:
  3714.  addq #1,a6
  3715.  addq #1,a5
  3716.  
  3717.  endc
  3718.  ifeq POLYGONDEPTH
  3719.  
  3720.  move.l d2,(a3)+
  3721.  
  3722.  endc
  3723.  add.l d7,d2
  3724.  dbra d0,.dodepth
  3725.  
  3726.  endc
  3727.  
  3728. .noline:
  3729.  add.l #320*4,DEPTHPTR
  3730.  add.w #320,a2
  3731.  
  3732.  swap d1
  3733.  dbra d1,DOAHORLINEGOUR
  3734.  
  3735.  bra NOPOLYGON
  3736.  
  3737.  
  3738.  
  3739.  
  3740.  
  3741. *******************************
  3742. STARTLINE:
  3743.  
  3744.  move.l a7,SAVESTACK
  3745.  move.l #SHADOWBUFFER,a7
  3746.  
  3747.  moveq #0,d1
  3748.  swap d6
  3749.  move.w d6,d1
  3750.  move.l d4,d7
  3751.  swap d7
  3752.  lsr.w #8,d7
  3753.  move.b d7,d1
  3754.  swap d6
  3755.  
  3756.  swap d0
  3757.  moveq #0,d7
  3758.  move.b (a7,d1.l*2),d7
  3759.  cmp.w d7,d0
  3760.  ble .startlight
  3761.  swap d0
  3762.  bra INTHEDARKGOUR
  3763. .startlight:
  3764.  swap d0
  3765.  bra INTHELIGHTGOUR 
  3766. .startdark:
  3767. ***********************************
  3768.  
  3769.  
  3770.  
  3771. PENUMBRAGOUR:
  3772.  moveq #0,d1
  3773.  swap d6
  3774.  move.w d6,d1
  3775.  move.l d4,d7
  3776.  lsr.l #8,d7
  3777.  swap d7
  3778.  move.b d7,d1
  3779.  swap d6
  3780.  add.l a5,d4
  3781.  add.l a6,d6
  3782.  add.l a3,d5
  3783.  
  3784.  swap d0
  3785.  moveq #0,d7
  3786.  move.b (a7,d1.l*2),d7
  3787.  cmp.w d7,d0
  3788.  ifne SHADOWMAP
  3789.  ble INTOLIGHTGOUR
  3790.  endc
  3791.  ifeq SHADOWMAP
  3792.  bra INTOLIGHTGOUR
  3793.  endc
  3794.  bra.s INTODARKGOUR
  3795.  
  3796. INTHEDARKGOUR:
  3797.  moveq #0,d1
  3798.  swap d6
  3799.  move.w d6,d1
  3800.  move.l d4,d7
  3801.  swap d7
  3802.  asr.w #8,d7
  3803.  move.b d7,d1
  3804.  swap d6
  3805.  add.l a5,d4
  3806.  add.l a6,d6
  3807.  add.l a3,d5
  3808.  
  3809.  swap d0
  3810.  moveq #0,d7
  3811.  move.b (a7,d1.l*2),d7
  3812.  cmp.w d7,d0
  3813.  ifne SHADOWMAP
  3814.  ble.s INTOPENUMGOUR
  3815.  endc
  3816.  ifeq SHADOWMAP
  3817.  bra INTOLIGHTGOUR
  3818.  endc
  3819. INTODARKGOUR:
  3820.  swap d0
  3821.  
  3822. ;**********************
  3823. ; moveq #0,d7
  3824. ;********************** 
  3825.  
  3826.  swap d2
  3827.  move.w d2,d1
  3828.  move.w d4,d7
  3829.  lsr.w #8,d7
  3830.  move.b d7,d1
  3831.  swap d2
  3832.  add.l a1,d2
  3833.  add.l a4,d3
  3834.  
  3835.  move.l #(31*32*256),d7
  3836.  move.b 1(a0,d1.w*4),d7
  3837.  bra DARKplottt
  3838.  
  3839. .noplottt
  3840.  addq #1,a2
  3841.  dbra d0,INTHEDARKGOUR
  3842.  bra DONEDONEBUM
  3843.  
  3844. INTOPENUMGOUR:
  3845.  swap d0
  3846.  
  3847. *********************
  3848. ; moveq #0,d7
  3849. *****************
  3850.  
  3851.  swap d2
  3852.  move.w d2,d1
  3853.  move.w d4,d7
  3854.  lsr.w #8,d7
  3855.  move.b d7,d1
  3856.  swap d2
  3857.  add.l a1,d2
  3858.  add.l a4,d3
  3859.  
  3860.  move.l (a0,d1.w*4),d1
  3861.  moveq #0,d7
  3862.  move.w d6,d7
  3863.  swap d3
  3864.  move.b d3,d7
  3865.  add.w d1,d7
  3866.  swap d3
  3867.  
  3868.  move.b 1(a7,d7.l*2),d7
  3869.  lsl.w #8,d7
  3870.  
  3871. ; sub.w #$1c00,d7
  3872.  asr.w #1,d7
  3873. ; add.w #$1c00,d7
  3874.  neg.w d7
  3875.  add.w #$1f00,d7
  3876.  sub.b d7,d7
  3877.  
  3878.  asl.l #5,d7
  3879.  swap d1
  3880.  move.b d1,d7
  3881.  
  3882.  
  3883.  bra.s PENUMplottt
  3884.  
  3885. .noplottt
  3886.  addq #1,a2
  3887.  dbra d0,PENUMBRAGOUR
  3888.  bra DONEDONEBUM
  3889.  
  3890.  
  3891. INTHELIGHTGOUR:
  3892.  
  3893.  moveq #0,d1
  3894.  swap d6
  3895.  move.w d6,d1
  3896.  move.l d4,d7
  3897.  swap d7
  3898.  lsr.w #8,d7
  3899.  move.b d7,d1
  3900.  swap d6
  3901.  add.l a5,d4
  3902.  add.l a6,d6
  3903.  add.l a3,d5
  3904.  
  3905.  swap d0
  3906.  moveq #0,d7
  3907.  move.b (a7,d1.l*2),d7
  3908.  cmp.w d7,d0
  3909.  
  3910.  
  3911.  ifne SHADOWMAP
  3912.  bgt.s INTOPENUMGOUR
  3913.  endc
  3914.  
  3915. INTOLIGHTGOUR:
  3916.  swap d0
  3917.  
  3918.  swap d2
  3919.  move.w d2,d1
  3920.  move.w d4,d7
  3921.  asr.w #8,d7
  3922.  move.b d7,d1
  3923.  swap d2
  3924.  
  3925.  move.l (a0,d1.w*4),d1        ; SPEC COL OFX OFY
  3926.  
  3927.  add.l a1,d2
  3928.  add.l a4,d3
  3929.  
  3930.  bra.s LIGHTPLOTT
  3931. .noplottt:
  3932.  addq #1,a2
  3933.  dbra d0,INTHELIGHTGOUR
  3934. FLIBBLEY:
  3935.  bra.s DONEDONEBUM
  3936.  
  3937. PENUMplottt
  3938.  move.b GOURPAL(pc,d7.l),(a2)+
  3939.  dbra d0,PENUMBRAGOUR
  3940.  bra.s DONEDONEBUM
  3941.  
  3942. DARKplottt
  3943.  move.b GOURPAL(pc,d7.l),(a2)+
  3944.  dbra d0,INTHEDARKGOUR
  3945.  bra.s DONEDONEBUM
  3946.  
  3947. LIGHTPLOTT:
  3948.  moveq #0,d7
  3949.  
  3950.  move.w d2,d7
  3951.  swap d5
  3952.  move.b d5,d7
  3953.  swap d5
  3954.  
  3955.  ifne BUMPSPEC
  3956.  add.w d1,d7    ; coord in spec map
  3957.  endc
  3958.  
  3959.  swap d1
  3960.  ifeq SPECMAP
  3961.  and.w #$ff,d1
  3962.  endc
  3963.  
  3964.  move.b 1(a7,d7.l*2),d7    ; specular value of point.
  3965.  lsl.w #8,d7
  3966.  
  3967.  ifne SPECULAR 
  3968.  add.w d7,d1
  3969.  endc
  3970.  
  3971.  ifeq SPECULAR
  3972.  tst.w d1
  3973.  endc
  3974.  
  3975.  bgt.s .okshiney
  3976.  and.w #$ff,d1
  3977. .okshiney
  3978.  
  3979.  move.w d6,d7
  3980.  swap d3
  3981.  move.b d3,d7
  3982.  swap d1
  3983.  
  3984.  ifne BUMPPHONG
  3985.  add.w d1,d7
  3986.  endc
  3987.  
  3988.  clr.w d1
  3989.  swap d1
  3990.  move.b 1(a7,d7.l*2),d7 ; brightness of point
  3991.  neg.b d7
  3992.  add.b #31,d7
  3993.  and.w #$ff,d7
  3994.  swap d7
  3995.  lsr.l #3,d7
  3996.  swap d3
  3997.  add.l d7,d1
  3998.  
  3999.  move.b GOURPAL(pc,d1.l),(a2)+
  4000.  dbra d0,INTHELIGHTGOUR
  4001. DONEDONEBUM:
  4002.  move.l SAVESTACK,a7
  4003.  rts
  4004.  
  4005. GOURPAL: incbin "ab3:includes/bigshadow.pal"
  4006.  
  4007.  
  4008.  
  4009.  
  4010. LEFTSHINEV: dc.l 0
  4011. RIGHTSHINEV: dc.l 0
  4012. LEFTSHINEU: dc.l 0
  4013. RIGHTSHINEU: dc.l 0
  4014.  
  4015. TOPPTR: dc.l 0
  4016. TOPPTNUM: dc.w 0
  4017. BOTPTNUM: dc.w 0
  4018. LEFTBRIGHT: dc.w 0
  4019. RIGHTBRIGHT: dc.l 0
  4020. LEFTSPEC: dc.w 0
  4021. RIGHTSPEC: dc.w 0
  4022.  
  4023. ***********************************************
  4024.     
  4025. SIMPLECALCLINE:
  4026.  
  4027.  ifne DEPTHQUEUE
  4028.  
  4029.  movem.l d0/d1,-(a7)
  4030.  
  4031.  move.l #ONSCREENPTS,a1
  4032.  
  4033.  move.w 2(a1,d0.w*4),d2        ;fy
  4034.  move.w 2(a1,d1.w*4),d7        ;sy
  4035.  
  4036.  move.l #RIGHTZS,a3
  4037.  asr.w #2,d2
  4038.  asr.w #2,d7
  4039.  cmp.w d2,d7
  4040.  beq .noline
  4041.  bgt.s .lineonright
  4042.  
  4043.  move.l #LEFTZS,a3
  4044.  exg d0,d1
  4045.  exg d2,d7 
  4046. .lineonright:
  4047.  
  4048.  move.l #ROTATEDPTS,a2
  4049.  muls #10,d0
  4050.  muls #10,d1
  4051.  move.w 8(a2,d0.w),d3
  4052.  move.w 8(a2,d1.w),d4
  4053.  
  4054.  sub.w d3,d4
  4055.  sub.w d2,d7
  4056.  
  4057.  ext.l d7
  4058.  swap d3
  4059.  clr.w d3
  4060.  swap d4
  4061.  clr.w d4
  4062.  divs.l d7,d4
  4063.  
  4064.  subq #1,d7
  4065.  lea (a3,d2.w*2),a3
  4066.  
  4067. .putindist:
  4068.  swap d3
  4069.  move.w d3,(a3)+
  4070.  swap d3
  4071.  add.l d4,d3
  4072.  dbra d7,.putindist
  4073.  
  4074.  movem.l (a7)+,d0/d1
  4075.  
  4076.  bra RESTOFDATA
  4077.  
  4078. .noline:
  4079.  movem.l (a7)+,d0/d1
  4080.  rts
  4081.  
  4082. RESTOFDATA:
  4083.  
  4084.  endc
  4085.  
  4086.  move.l #ONSCREENPTS,a1
  4087.  
  4088.  move.w 2(a1,d0.w*4),d2        ;fy
  4089.  move.w 2(a1,d1.w*4),d7        ;sy
  4090.  
  4091.  move.l #RIGHTUVS,a3
  4092.  asr.w #2,d2
  4093.  asr.w #2,d7
  4094.  cmp.w d2,d7 
  4095.  beq .noline
  4096.  
  4097.  bgt.s .lineonright
  4098. .lineonleft:
  4099.  move.l #LEFTUVS,a3
  4100.  exg d0,d1
  4101.  exg d2,d7
  4102.  
  4103. .lineonright:
  4104.  move.w d0,TOPPTNUM
  4105.  move.w d1,BOTPTNUM
  4106.  
  4107.  sub.w d2,d7
  4108.  move.w d2,d3
  4109.  muls #20,d3
  4110.  asl.w #4,d2
  4111.  add.w d3,a3
  4112.  move.l a3,TOPPTR
  4113.  
  4114.  move.w d7,YDIFF
  4115.  
  4116.  move.w (a1,d0.w*4),d3        ;fx
  4117.  move.w (a1,d1.w*4),d7        ;sx
  4118.  
  4119.  sub.w d3,d7
  4120.  swap d3
  4121.  swap d7
  4122.  clr.w d3
  4123.  clr.w d7
  4124.  divs.l YDIFF-2,d7
  4125.  move.l d7,a0    ; dx
  4126.  
  4127.  move.l #UVCOORDS,a2
  4128.  move.l #SHADOWPTS,a1
  4129.  
  4130.  move.w (a2,d0.w*4),d4
  4131.  move.w 2(a2,d0.w*4),d5
  4132.  move.w (a2,d1.w*4),d6
  4133.  move.w 2(a2,d1.w*4),d7
  4134.  
  4135.  sub.w d4,d6
  4136.  sub.w d5,d7
  4137.  swap d4
  4138.  swap d5
  4139.  clr.w d4
  4140.  clr.w d5
  4141.  swap d6
  4142.  swap d7
  4143.  clr.w d6
  4144.  clr.w d7
  4145.  
  4146.  divs.l YDIFF-2,d6
  4147.  divs.l YDIFF-2,d7
  4148.  
  4149.  move.l d6,a4
  4150.  move.l d7,a5
  4151.  
  4152.  muls #10,d0
  4153.  muls #10,d1
  4154.  move.l (a1,d0.w),d6
  4155.  
  4156.  move.l (a1,d1.w),d7
  4157.  asl.l #5,d6
  4158.  asl.l #5,d7
  4159.  sub.l d6,d7
  4160.  divs.l YDIFF-2,d7
  4161.  move.l d7,a2
  4162.  move.l d6,a6
  4163.  
  4164.  move.l 4(a1,d0.w),d6
  4165.  move.l 4(a1,d1.w),d7
  4166.  asl.l #5,d6
  4167.  asl.l #5,d7
  4168.  sub.l d6,d7
  4169.  divs.l YDIFF-2,d7
  4170.  exg d7,a6
  4171.  exg d7,d6
  4172.  
  4173.  move.w 8(a1,d0.w),d0
  4174.  move.w 8(a1,d1.w),d1
  4175.  swap d0
  4176.  swap d1
  4177.  clr.w d0
  4178.  clr.w d1
  4179.  asr.l #2,d0
  4180.  asr.l #2,d1
  4181.  sub.l d0,d1
  4182.  divs.l YDIFF-2,d1
  4183.  move.l d1,a1
  4184.  move.l YDIFF-2,d1
  4185.  subq #1,d1
  4186.  
  4187. ; d3=sx a0=dsx
  4188. ; d4=u a4=du
  4189. ; d5=v a5=dv
  4190. ; d6=x a2=dx
  4191. ; d7=y a6=dy
  4192. ; d0=z a1=dz
  4193. ; d1=dsy
  4194.  
  4195.  
  4196.  add.l #128*65536,d6
  4197.  add.l #128*65536,d7
  4198.  add.l #128*65536,d0
  4199.  
  4200. .PUTINLINE:
  4201.  swap d3
  4202.  move.w d3,(a3)+
  4203.  swap d3
  4204.  add.l a0,d3
  4205.  move.l d4,(a3)+
  4206.  add.l a4,d4
  4207.  move.l d5,(a3)+
  4208.  swap d6
  4209.  add.l a5,d5
  4210.  move.w d6,(a3)+
  4211.  swap d6
  4212.  swap d7
  4213.  add.l a2,d6
  4214.  move.w d7,(a3)+
  4215.  swap d7
  4216.  swap d0
  4217.  add.l a6,d7
  4218.  move.w d0,(a3)+
  4219.  addq #4,a3
  4220.  swap d0
  4221.  add.l a1,d0
  4222.  dbra d1,.PUTINLINE
  4223.  
  4224.  tst.b Gouraud
  4225.  beq .noline
  4226.  
  4227.  move.w TOPPTNUM,d0
  4228.  move.w BOTPTNUM,d1
  4229.  move.l TOPPTR,a3
  4230.  moveq #0,d6
  4231.  move.w YDIFF,d6
  4232.  
  4233.  move.l #SPECBRIGHTS,a2
  4234.  
  4235.  moveq #0,d2
  4236.  moveq #0,d3
  4237.  move.b (a2,d0.w*4),d2
  4238.  move.b 1(a2,d0.w*4),d3
  4239.  sub.w #128,d2
  4240.  sub.w #128,d3
  4241.  
  4242.  move.w d2,d4
  4243.  move.w d3,d5
  4244.  muls ACOS,d2
  4245.  muls ASIN,d3
  4246.  sub.l d3,d2
  4247.  muls ASIN,d4
  4248.  muls ACOS,d5
  4249.  add.l d5,d4
  4250.  asl.l #2,d2
  4251.  swap d2
  4252.  asl.l #2,d4
  4253.  swap d4
  4254.  
  4255.  add.w #128,d2
  4256.  add.w #128,d4
  4257.  move.w d2,FSX
  4258.  move.w d4,FSY
  4259.  
  4260.  moveq #0,d2
  4261.  moveq #0,d3
  4262.  move.b (a2,d1.w*4),d2
  4263.  move.b 1(a2,d1.w*4),d3
  4264.  sub.w #128,d2
  4265.  sub.w #128,d3
  4266.  
  4267.  move.w d2,d4
  4268.  move.w d3,d5
  4269.  muls ACOS,d2
  4270.  muls ASIN,d3
  4271.  sub.l d3,d2
  4272.  muls ASIN,d4
  4273.  muls ACOS,d5
  4274.  add.l d5,d4
  4275.  asl.l #2,d2
  4276.  swap d2
  4277.  asl.l #2,d4
  4278.  swap d4
  4279.  
  4280.  add.w #128,d2
  4281.  add.w #128,d4
  4282.  move.w d2,SSX
  4283.  move.w d4,SSY
  4284.  
  4285.  
  4286.  move.w 2(a2,d0.w*4),d2
  4287.  move.w 2(a2,d1.w*4),d3
  4288.  
  4289.  asr.w #4,d2
  4290.  asr.w #4,d3
  4291.  
  4292.  bra .bothtowards
  4293.  
  4294.  tst.w d2
  4295.  blt .firsttowards
  4296.  bgt.s .firstaway
  4297.  
  4298.  tst.w d3
  4299.  ble .bothtowards
  4300.  bra .bothaway
  4301.  
  4302. .firstaway
  4303.  tst.w d3
  4304.  blt .sectowards
  4305.  bra .bothaway
  4306.  
  4307. .firsttowards:
  4308.  tst.w d3
  4309.  ble .bothtowards
  4310.  
  4311. ; First one is towards, the second away.
  4312. ; Do the line in two bits: one heading
  4313. ; from the first point to the rim, the
  4314. ; other heading from the rim to the second
  4315. ; point and flagged as behind.
  4316.  
  4317.  move.w d6,d7    ; total length to draw
  4318.  move.w d2,FIRSTY
  4319.  move.w d3,LASTY
  4320.  
  4321.  neg.w d2
  4322.  add.w d2,d3     ; total change in Y
  4323.  
  4324.  bra.s .onetowards
  4325.  
  4326. .sectowards:
  4327.  move.w d6,d7    ; total length to draw
  4328.  move.w d2,FIRSTY
  4329.  move.w d3,LASTY
  4330.  neg.w d3
  4331.  add.w d2,d3
  4332.  
  4333. .onetowards:
  4334.  
  4335.  muls d2,d6
  4336.  divs d3,d6    ; length of first bit of line.
  4337.  
  4338.  ext.l d6
  4339.  ext.l d7
  4340.  
  4341.  move.w d6,FIRSTLEN
  4342.  sub.l d6,d7
  4343.  move.w d7,LASTLEN
  4344.  
  4345.  add.l d7,d6
  4346.  
  4347.  move.w FIRSTY,d2
  4348.  move.w LASTY,d3
  4349.  swap d2
  4350.  clr.w d2
  4351.  swap d3
  4352.  clr.w d3
  4353.  sub.l d2,d3
  4354.  divs.l d6,d3
  4355.  move.l d3,a6
  4356.  move.l d2,d7
  4357.  
  4358.  moveq #0,d2
  4359.  moveq #0,d3
  4360.  moveq #0,d4
  4361.  moveq #0,d5
  4362.  move.b (a2,d0.w*4),d2
  4363.  move.b 1(a2,d0.w*4),d3
  4364.  
  4365.  move.w d2,FIRSTU
  4366.  move.w d3,FIRSTV
  4367.  
  4368.  move.w d2,d4
  4369.  move.w d3,d5
  4370.  sub.w #128,d2
  4371.  sub.w #128,d3
  4372.  muls d2,d2
  4373.  muls d3,d3
  4374.  add.l d3,d2
  4375.  jsr CALCSQROOT
  4376.  
  4377.  tst.w d2
  4378.  beq.s .nochng
  4379.  
  4380.  sub.w #128,d4
  4381.  sub.w #128,d5
  4382.  muls #127,d4
  4383.  muls #127,d5
  4384.  divs d2,d4
  4385.  divs d2,d5
  4386.  add.w #128,d4
  4387.  add.w #128,d5
  4388.  
  4389. .nochng:
  4390.  
  4391.  move.w d4,MIDU
  4392.  move.w d5,MIDV
  4393.  
  4394.  move.b (a2,d1.w*4),d4
  4395.  move.b 1(a2,d1.w*4),d5
  4396.  move.w d4,SECU
  4397.  move.w d5,SECV
  4398.  
  4399. ; move.w d4,d2
  4400. ; move.w d5,d3
  4401. ;
  4402. ; sub.w #128,d2
  4403. ; sub.w #128,d3
  4404. ; muls d2,d2
  4405. ; muls d3,d3
  4406. ; add.l d3,d2
  4407. ; jsr CALCSQROOT
  4408. ;
  4409. ; tst.w d2
  4410. ; beq.s .nochng2
  4411. ;
  4412. ; sub.w #128,d4
  4413. ; sub.w #128,d5
  4414. ; muls #127,d4
  4415. ; muls #127,d5
  4416. ; divs d2,d4
  4417. ; divs d2,d5
  4418. ; add.w #128,d4
  4419. ; add.w #128,d5
  4420. ;.nochng2:
  4421. ;
  4422. ; add.w MIDU,d4
  4423. ; add.w MIDV,d5
  4424. ; asr.w #1,d4
  4425. ; asr.w #1,d5
  4426. ; move.w d4,MIDU
  4427. ; move.w d4,MIDV
  4428.  
  4429.  move.l #NORMBRIGHTS,a2
  4430.  move.w (a2,d0.w*2),d0
  4431.  move.w (a2,d1.w*2),d1
  4432.  
  4433.  sub.w d0,d1
  4434.  swap d1
  4435.  swap d0
  4436.  divs.l d6,d1
  4437.  
  4438.  move.w FIRSTLEN,d6
  4439.  beq.s .nofirstbit
  4440.  ext.l d6
  4441.  
  4442.  moveq #0,d2
  4443.  moveq #0,d3
  4444.  moveq #0,d4
  4445.  moveq #0,d5
  4446.  move.w FIRSTU,d2
  4447.  move.w MIDU,d3
  4448.  move.w FIRSTV,d4
  4449.  move.w MIDV,d5
  4450.  
  4451.  sub.w d2,d3
  4452.  swap d2
  4453.  swap d3
  4454.  divs.l d6,d3
  4455.  move.l d3,a4
  4456.  
  4457.  sub.w d4,d5
  4458.  swap d4
  4459.  swap d5
  4460.  divs.l d6,d5
  4461.  move.l d5,a5
  4462.  
  4463.  bsr DOABITOFLINE
  4464. .nofirstbit:
  4465.  
  4466.  move.w LASTLEN,d6
  4467.  beq.s .nosecbit
  4468.  ext.l d6
  4469.  
  4470.  moveq #0,d2
  4471.  moveq #0,d3
  4472.  moveq #0,d4
  4473.  moveq #0,d5
  4474.  move.w MIDU,d2
  4475.  move.w SECU,d3
  4476.  move.w MIDV,d4
  4477.  move.w SECV,d5
  4478.  
  4479.  sub.w d2,d3
  4480.  swap d2
  4481.  swap d3
  4482.  divs.l d6,d3
  4483.  move.l d3,a4
  4484.  
  4485.  sub.w d4,d5
  4486.  swap d4
  4487.  swap d5
  4488.  divs.l d6,d5
  4489.  move.l d5,a5
  4490.  
  4491.  bsr DOABITOFLINE
  4492. .nosecbit:
  4493.  
  4494.  bra .noline
  4495.  
  4496. .bothaway
  4497.  
  4498. ; Both are away, so do it simply.
  4499.  
  4500. .bothtowards:
  4501.  
  4502. ; Both are towards, so do it simply and flag all
  4503. ; points as towards.
  4504.  
  4505.  swap d2
  4506.  clr.w d2
  4507.  swap d3
  4508.  clr.w d3
  4509.  sub.l d2,d3
  4510.  divs.l d6,d3
  4511.  move.l d3,a6
  4512.  move.l d2,d7
  4513.  
  4514.  moveq #0,d2
  4515.  moveq #0,d3
  4516.  moveq #0,d4
  4517.  moveq #0,d5
  4518. ; move.b (a2,d0.w*4),d2
  4519. ; move.b (a2,d1.w*4),d3
  4520. ; move.b 1(a2,d0.w*4),d4
  4521. ; move.b 1(a2,d1.w*4),d5
  4522.  
  4523.  move.w FSX,d2
  4524.  move.w SSX,d3
  4525.  move.w FSY,d4
  4526.  move.w SSY,d5
  4527.  
  4528.  sub.w d2,d3
  4529.  swap d2
  4530.  swap d3
  4531.  divs.l d6,d3
  4532.  move.l d3,a4
  4533.  
  4534.  sub.w d4,d5
  4535.  swap d4
  4536.  swap d5
  4537.  divs.l d6,d5
  4538.  move.l d5,a5
  4539.  
  4540.  move.l #NORMBRIGHTS,a2
  4541.  movem.l d2/d4,-(a7)
  4542.  
  4543.  moveq #0,d2
  4544.  moveq #0,d3
  4545.  move.b (a2,d0.w*2),d2
  4546.  move.b 1(a2,d0.w*2),d3
  4547.  sub.w #128,d2
  4548.  sub.w #128,d3
  4549.  
  4550.  move.w d2,d4
  4551.  move.w d3,d5
  4552.  muls ACOS,d2
  4553.  muls ASIN,d3
  4554.  sub.l d3,d2
  4555.  muls ASIN,d4
  4556.  muls ACOS,d5
  4557.  add.l d5,d4
  4558.  asl.l #2,d2
  4559.  swap d2
  4560.  asl.l #2,d4
  4561.  swap d4
  4562.  
  4563.  add.w #128,d2
  4564.  add.w #128,d4
  4565.  move.w d2,FSX
  4566.  move.w d4,FSY
  4567.  
  4568.  moveq #0,d2
  4569.  moveq #0,d3
  4570.  move.b (a2,d1.w*2),d2
  4571.  move.b 1(a2,d1.w*2),d3
  4572.  sub.w #128,d2
  4573.  sub.w #128,d3
  4574.  
  4575.  move.w d2,d4
  4576.  move.w d3,d5
  4577.  muls ACOS,d2
  4578.  muls ASIN,d3
  4579.  sub.l d3,d2
  4580.  muls ASIN,d4
  4581.  muls ACOS,d5
  4582.  add.l d5,d4
  4583.  asl.l #2,d2
  4584.  swap d2
  4585.  asl.l #2,d4
  4586.  swap d4
  4587.  
  4588.  add.w #128,d2
  4589.  add.w #128,d4
  4590.  move.w d2,SSX
  4591.  move.w d4,SSY
  4592.  
  4593.  moveq #0,d0
  4594.  moveq #0,d1
  4595.  moveq #0,d3
  4596.  moveq #0,d5
  4597.  
  4598.  move.w FSY,d3
  4599.  move.w SSY,d5
  4600.  move.w FSX,d0
  4601.  move.w SSX,d1
  4602.  
  4603.  ext.l d0
  4604.  ext.l d1
  4605.  sub.w d0,d1
  4606.  swap d1
  4607.  swap d0
  4608.  divs.l d6,d1
  4609.  
  4610.  ext.l d3
  4611.  ext.l d5
  4612.  sub.w d3,d5
  4613.  swap d5
  4614.  swap d3
  4615.  divs.l d6,d5
  4616.  
  4617.  movem.l (a7)+,d2/d4
  4618.  
  4619.  move.l d6,-(a7)
  4620.  bsr DOABITOFLINE
  4621.  move.l (a7)+,d6
  4622.  
  4623.  move.w TOPPTNUM,d0
  4624.  move.w BOTPTNUM,d1
  4625.  move.l TOPPTR,a3
  4626.  move.l #NORMVECTS,a2
  4627.  muls #6,d0
  4628.  muls #6,d1
  4629.  moveq #0,d2
  4630.  moveq #0,d3
  4631.  move.w 2(a2,d0.w),d2    ; firsty
  4632.  move.w 2(a2,d1.w),d3    ; secy
  4633.  sub.w d2,d3
  4634.  swap d3
  4635.  swap d2
  4636.  divs.l d6,d3
  4637.  
  4638.  subq #1,d6
  4639. .stickiny
  4640.  swap d2
  4641.  move.w d2,18(a3)
  4642.  swap d2
  4643.  add.l d3,d2
  4644.  add.w #20,a3
  4645.  dbra d6,.stickiny
  4646.  
  4647. .noline:
  4648.  rts
  4649.  
  4650.  DOABITOFLINE:
  4651.  subq #1,d6
  4652.  
  4653. .STICKINGOUR:
  4654.  swap d7
  4655.  move.b d7,2(a3)
  4656.  swap d7
  4657.  add.l a6,d7
  4658.  swap d0
  4659.  move.w d0,4(a3)
  4660.  swap d0
  4661.  add.l d1,d0
  4662.  swap d2
  4663.  move.b d2,8(a3)
  4664.  swap d4
  4665.  move.b d4,9(a3)
  4666.  swap d4
  4667.  swap d3
  4668.  move.w d3,16(a3)
  4669.  swap d3
  4670.  add.l d5,d3
  4671.  
  4672.  adda.w #20,a3
  4673.  swap d2
  4674.  add.l a4,d2
  4675.  add.l a5,d4
  4676.  dbra d6,.STICKINGOUR
  4677.  
  4678.  rts
  4679.  
  4680. FIRSTY: dc.w 0
  4681. LASTY: dc.w 0
  4682. FIRSTU: dc.w 0
  4683. SECU: dc.w 0
  4684. FIRSTV: dc.w 0
  4685. SECV: dc.w 0
  4686.     dc.w 0
  4687. FIRSTLEN: dc.w 0
  4688.     dc.w 0
  4689. LASTLEN: dc.w 0
  4690. MIDU: dc.w 0
  4691. MIDV: dc.w 0
  4692.  
  4693. *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  4694.  
  4695.  
  4696.  
  4697. ************************************************
  4698. ************************************************
  4699. ************************************************
  4700. ************************************************
  4701. ************************************************
  4702. ************************************************
  4703. ************************************************
  4704. ************************************************
  4705. ************************************************
  4706. ************************************************
  4707. ************************************************
  4708. ************************************************
  4709. ************************************************
  4710. ************************************************
  4711. ************************************************
  4712. ************************************************
  4713. ************************************************
  4714.  
  4715.  move.w d3,TOPLINE
  4716.  move.w d4,BOTLINE
  4717.  
  4718.  
  4719.  
  4720.  
  4721. *********************************************
  4722.  
  4723. CALCSQROOT:
  4724.  tst.l d2
  4725.  beq .oksqr
  4726.  
  4727.  movem.l d0/d1/d3-d7/a0-a6,-(a7)
  4728.  
  4729.  move.w #31,d0
  4730. .findhigh
  4731.  btst d0,d2
  4732.  bne .foundhigh
  4733.  dbra d0,.findhigh
  4734. .foundhigh
  4735.  asr.w #1,d0
  4736.  clr.l d3
  4737.  bset d0,d3
  4738.  move.l d3,d0
  4739.  
  4740.  move.w d0,d1
  4741.  muls d1,d1    ; x*x
  4742.  sub.l d2,d1    ; x*x-a
  4743.  asr.l #1,d1    ; (x*x-a)/2
  4744.  divs d0,d1    ; (x*x-a)/2x
  4745.  sub.w d1,d0    ; second approx
  4746.  bgt .stillnot0
  4747.  move.w #1,d0
  4748. .stillnot0
  4749.  
  4750.  move.w d0,d1
  4751.  muls d1,d1
  4752.  sub.l d2,d1
  4753.  asr.l #1,d1
  4754.  divs d0,d1
  4755.  sub.w d1,d0    ; second approx
  4756.  bgt .stillnot02
  4757.  move.w #1,d0
  4758. .stillnot02
  4759.  
  4760.  move.w d0,d1
  4761.  muls d1,d1
  4762.  sub.l d2,d1
  4763.  asr.l #1,d1
  4764.  divs d0,d1
  4765.  sub.w d1,d0    ; second approx
  4766.  bgt .stillnot03
  4767.  move.w #1,d0
  4768. .stillnot03
  4769.  
  4770.  move.w d0,d2
  4771.  ext.l d2
  4772.  
  4773.  movem.l (a7)+,d0/d1/d3-d7/a0-a6
  4774.  
  4775. .oksqr
  4776.  rts
  4777.  
  4778.  
  4779. **********************************************
  4780. **********************************************
  4781. **********************************************
  4782. **********************************************
  4783. **********************************************
  4784. **********************    ************************
  4785. **********************************************
  4786. **********************************************
  4787. **********************************************
  4788. **********************************************
  4789. **********************************************
  4790. **********************************************
  4791. **********************************************
  4792. **********************************************
  4793. **********************************************
  4794. **********************************************
  4795. **********************************************
  4796. **********************************************
  4797. **********************************************
  4798.  
  4799. TOPLINE: dc.w 0
  4800. BOTLINE: dc.w 0
  4801.  
  4802.  
  4803.  
  4804. **********************************************
  4805. **********************************************
  4806. **********************************************
  4807. **********************************************
  4808. **********************************************
  4809. **********************************************
  4810. **********************************************
  4811. **********************************************
  4812. **********************************************
  4813. **********************************************
  4814. **********************************************
  4815. **********************************************
  4816. **********************************************
  4817. **********************************************
  4818. **********************************************
  4819. **********************************************
  4820. **********************************************
  4821. **********************************************
  4822. **********************************************
  4823.     
  4824.  
  4825.     
  4826.  dc.w 0
  4827. YDIFF: dc.w 0
  4828.  
  4829. SPINAROUND: dc.w 0    
  4830. XCOS: dc.w 0
  4831. YCOS: dc.w 0
  4832. XSIN: dc.w 0
  4833. YSIN: dc.w 0
  4834. XCOS3: dc.w 0
  4835. YCOS3: dc.w 0
  4836. XSIN3: dc.w 0
  4837. YSIN3: dc.w 0
  4838. XCOS2: dc.w 0
  4839. YCOS2: dc.w 0
  4840. XSIN2: dc.w 0
  4841. YSIN2: dc.w 0
  4842. XADD: dc.l 0
  4843. YADD: dc.l 0
  4844. ZADD: dc.l 0
  4845. XOFF: dc.w 0
  4846. YOFF: dc.w 0
  4847. OLDXM: dc.w 0
  4848. OLDYM: dc.w 0
  4849.  
  4850.  
  4851.  
  4852. TEXTUREADD: dc.w 0
  4853.  
  4854.  
  4855. **********************************************************
  4856.  
  4857. UVCOORDS: ds.l 250
  4858. ROTATEDPTS: ds.l 250*4
  4859. SHADOWPTS: ds.l 250*4
  4860. ONSCREENPTS: ds.l 250
  4861.  
  4862. ZOFF:
  4863.  ifeq LARGESCREEN
  4864.  dc.w 768
  4865.  endc
  4866.  ifne LARGESCREEN
  4867.  dc.w 300
  4868.  endc
  4869.  
  4870. BALLXOFF: dc.w 0
  4871. BALLYOFF: dc.w 0
  4872. BALLZOFF: dc.w 0
  4873.     dc.w 999,0,0
  4874.  
  4875.     dc.w 0,0,0
  4876.     dc.w 0,0,0
  4877.     dc.w 0,0,0
  4878.     dc.w 0,0,0
  4879.  
  4880.  
  4881. BALLXANGPOS: dc.w 100,0
  4882. BALLYANGPOS: dc.w 150,0
  4883. BALLZANGPOS: dc.w 120,0
  4884.  
  4885.     dc.w 80,2000,100,200,100,1000
  4886.     dc.w 40,200,220,2000,150,1000
  4887.     dc.w 180,20,100,200,120,100
  4888.     dc.w 280,200,50,2000,170,100
  4889.  
  4890. LEFTRIGHT: ds.l 256
  4891.  
  4892. POLYGONDATA:
  4893.  ds.b 30000
  4894.  
  4895. OBJNAME: dc.b "ab3:vectobj/testcube",0
  4896.  even
  4897. doslibname: dc.b 'dos.library',0
  4898.  even
  4899. doslib: dc.l 0
  4900.  
  4901. ****************************
  4902.  
  4903. SINETABLE:
  4904.  incbin "ab3:includes/bigsine"
  4905.  
  4906.  
  4907. YANG: dc.w 0
  4908. XANG: dc.w 0
  4909.  
  4910.  
  4911. xmouse: dc.w 0
  4912. ymouse: dc.w 0
  4913.  
  4914. spleen: dc.w 0
  4915. lastspleen: dc.w 0
  4916.  
  4917. COPIEDPAL:
  4918.  dc.w 256,0
  4919.  ds.l 3*256
  4920.  ds.l 10
  4921.  
  4922. SHADOWBUFFER:
  4923. HIGHLIGHT: incbin "work:temp/HIGHLIGHT"
  4924.  
  4925. PALETTEBIT:
  4926. ; incbin "256palette"
  4927. ; dc.w $ffff,$fffe
  4928.  
  4929.  incbin "ab3:shadowtex/shadowpal"
  4930.  
  4931.  include "ab3:source_4000/chunky.s"
  4932.  
  4933. willy: ds.w 48
  4934.  
  4935.  
  4936. PALS:
  4937.  ds.l 2*49
  4938.  
  4939. pregour: dc.b 0
  4940. Gouraud: dc.b 0
  4941.  
  4942. PointAngPtr: dc.l 0
  4943. FRAMENUM: dc.w 0
  4944. PolyAngPtr: dc.l 0
  4945. PtsPtr: dc.l 0
  4946. LinesPtr: dc.l 0
  4947. POINTER_TO_POINTERS: dc.l 0
  4948. FRAME: dc.w 4
  4949. FLIBBLE: dc.w 0
  4950. START_OF_OBJECT: dc.l 0
  4951. num_points: dc.w 0
  4952. num_frames: dc.w 0
  4953. SORTIT: dc.w 0
  4954. PartBuffer: ds.l 2*32
  4955. endparttab:
  4956.  
  4957. x1: dc.w 0
  4958. y1: dc.w 0
  4959. z1: dc.w 0
  4960. x2: dc.w 0
  4961. y2: dc.w 0
  4962. z2: dc.w 0
  4963. x2b: dc.w 0
  4964. y2b: dc.w 0
  4965. z2b: dc.w 0
  4966.  
  4967. x3: dc.w 0
  4968. y3: dc.w 0
  4969. z3: dc.w 0
  4970.  
  4971. l1: dc.w 0
  4972. l2: dc.w 0
  4973.  
  4974. OBJONOFF: dc.l 0
  4975.  
  4976. SAVEHIGHS: ds.w 30
  4977.  
  4978. FASTBUFFER:
  4979.  dc.l fasty
  4980.  
  4981.  DS.B 64*256
  4982. fasty: ds.b 320*256
  4983.  ds.b 64*256
  4984.  
  4985. ; ifne MOTIONBLUR
  4986. fasty2:
  4987.  ds.b 320*256
  4988. ; endc
  4989.  
  4990. NORMBRIGHTS: ds.w 250
  4991.  
  4992. SPECBRIGHTS:
  4993.  dcb.l 100,31
  4994.  
  4995. ENDNORM:
  4996.  
  4997. LEFTUVS: ds.w 10*256
  4998. RIGHTUVS: ds.w 10*256
  4999.  
  5000. LEFTZS: ds.w 256
  5001. RIGHTZS: ds.w 256
  5002.  
  5003. NORMVECTS: ds.w 3*250
  5004.  
  5005. ;WORLD: incbin "ab3:includes/world"
  5006.  
  5007. ;TWEEN: incbin "ab3:includes/tweenbrightfile"
  5008.  
  5009. LINEBUFFER: ds.b 320
  5010.  
  5011. NEBBIE: incbin "work:temp/nebbieroar"
  5012.     ds.l (192/4)*16
  5013.  
  5014.  SECTION blib,code_f
  5015.  
  5016. TEXTURES:
  5017.  incbin "ab3:shadowtex/shadowmaps"
  5018.  even
  5019.  
  5020. BLUR:
  5021.  ifne MOTIONBLUR!ANTIALIAS
  5022.  incbin "ab3:shadowtex/blurfile"
  5023.  endc
  5024.  
  5025. FIREPAL: incbin "ab3:includes/spleen.256pal"
  5026.  
  5027. DEPTHBUFFER: ds.l 320*256
  5028.  
  5029. BALL: incbin "ab3:includes/ballzbuff"
  5030.  
  5031. Font: dc.l fontplace
  5032.  
  5033. fontplace: incbin "ab3:XENFONT.bin"
  5034.  
  5035.  SECTION BGDROP,code_c
  5036.  
  5037. RAWSCRN:
  5038.  ds.l 2560*8
  5039.  
  5040.